131

I have a list of parameters like this:

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

IEnumerable<Parameter> parameters;

And a array of strings i want to check it against.

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

I want to iterate over the parameter list and check if the source property is equal to any of the myStrings array. I can do this with nested foreach's but i would like to learn how to do it in a nicer way as i have been playing around with linq and like the extension methods on enumerable like where etc so nested foreachs just feel wrong. Is there a more elegant preferred linq/lambda/delegete way to do this.

Thanks

4

4 に答える 4

274

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

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

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

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

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

于 2012-06-19T00:38:18.973 に答える