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


97

私はこのようなパラメータのリストを持っています:

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が間違っていると感じる場所など、列挙可能な拡張メソッドのように、より良い方法でそれを行う方法を学びたいと思います。これを行うためのよりエレガントな好ましいlinq / lambda / delegeteの方法はありますか?

ありがとう

回答:


207

Any()このチェックにはネストされたものを使用できます。これは次のいずれかで使用できますEnumerable

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

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

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

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


おかげで私が探しているもののようです私はそれを試してみます。物事の機能面をもう少しいじる必要があります。クラスとプロパティの大文字化に関しては、上記の例を書いたときに忘れられていました。
gdp 2012年

1
なぜO(n ^ 2)?1つではなく2つの変数について話しているので、O(n * m)ではありませんか?m(パラメータ)は定数なので、O(n)と同じです。ここで交差がどのように速くなるかわかりませんか?しかし、同意しましたが、Intersectはより高速になる可能性がありますが、保証されていません。
squazz 2016年

あなたはそれがO(n * m)であるべきだということは正しいです-mは定数ではありません-それはリストの1つのサイズですが、与えられた特定の例では「2」かもしれません。実際には定数値でさえ無視できません-重要なリストの長さはすべてIntersect高速になります-リストが簡単に短い場合は、何らかの方法で問題になりません(その場合、パフォーマンスはおそらくまったく問題ではありません) )
BrokenGlass 2016年

条件が真になるリストインデックスをどのように把握できますか?文章のリストがあります。特定の単語を含む配列があります。文に配列から少なくとも1つの単語が含まれている場合は、リストのインデックスが必要です。@BrokenGlass
キルシャン

1
パフォーマンスに関してparameters.Any(x => myStrings.Contains(x.source));は、最初の例よりも優れていると思いませんか?
fluppe 2018年

3

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

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!");
}

2
関連するリストが大きい場合、リストIntersectのサイズがO(N * M)であるため、これはアプローチよりもはるかに遅くなることに注意してください。(ただし、メモリ内のO(1)です。)
JonSkeet19年

1

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

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.