web-dev-qa-db-ja.com

list <t>に別のリストが含まれているかどうかを確認します

次のようなパラメーターのリストがあります。

public class parameter
{
    public string name {get; set;}
    public string paramtype {get; set;}
    public string source {get; set;}
}

IEnumerable<Parameter> parameters;

そして、私はそれをチェックしたい文字列の配列。

string[] myStrings = new string[] { "one", "two"};

パラメータリストを反復処理し、sourceプロパティがmyStrings配列のいずれかに等しいかどうかを確認します。私はネストされたforeachでこれを行うことができますが、linqで遊んでいるように、それをネストしたforeachが間違っていると感じるようなetcのような列挙型の拡張メソッドが好きなので、より良い方法でそれを行う方法を学びたいです。これを行うためのよりエレガントな優先linq/lambda/delegete方法がありますか?.

ありがとう

70
gdp

このチェックには、Enumerableで使用可能なネストされたAny()を使用できます。

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));

大きなコレクションでより高速に実行するには、parameterssourceに投影し、Intersectを使用して、内部的にHashSet<T>したがって、最初のアプローチ(2つのネストされたループに相当)のO(n ^ 2)の代わりに、O(n)でチェックを行うことができます。

bool hasMatch = parameters.Select(x => x.source)
                          .Intersect(myStrings)
                          .Any(); 

また、サイドコメントとして、クラス名とプロパティ名を大文字にしてC#スタイルのガイドラインに準拠する必要があります。

152
BrokenGlass

別のリストに一致要素があるかどうかを確認するサンプルを次に示します

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};

if (nums1.Any(x => nums2.Any(y => y == x)))
{
    Console.WriteLine("There are equal elements");
}
else
{
    Console.WriteLine("No Match Found!");
}
0

両方のリストが大きすぎる場合、およびラムダ式を使用する場合、フェッチに時間がかかります。この場合、linqを使用してパラメーターリストを取得することをお勧めします。

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
0
Umang Agarwal