检查列表<t>是否包含任何其他列表
我有这样的参数列表:
public class parameter { public string name {get; set;} public string paramtype {get; set;} public string source {get; set;} } IEnumerable<Parameter> parameters;
而我想检查它的string数组。
string[] myStrings = new string[] { "one", "two"};
我想迭代参数列表,并检查源属性是否等于任何myStrings数组。 我可以用嵌套的foreach来做到这一点,但我想学习如何以更好的方式来做到这一点,因为我已经玩弄了LINQ,就像enumerable的扩展方法一样,所以嵌套的foreach只是感觉错了。 有没有一个更优雅的首选linq / lambda / delegete方式来做到这一点。
谢谢
你可以使用一个嵌套的Any()
来检查任何Enumerable
上可用的检查:
bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));
在较大的集合上执行速度更快的是将parameters
投影到source
,然后使用Intersect
在内部使用HashSet<T>
而不是O(n ^ 2)作为第一种方法(相当于两个嵌套循环),您可以执行检查在O(n)中:
bool hasMatch = parameters.Select(x => x.source) .Intersect(myStrings) .Any();
也作为一个方面的评论,你应该大写你的类名称和属性名称,以符合C#风格的指导方针。