我有一个像这样的参数列表:
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,就像可枚举的扩展方法一样,所以嵌套的foreachs只是感觉不对。有没有更优雅的首选linq / lambda / delegete方法来做到这一点。
由于
答案 0 :(得分:137)
您可以使用嵌套Any()
进行此检查,该检查可在任何Enumerable
上使用:
bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));
在较大的集合上执行速度更快的是将parameters
投射到source
,然后使用内部使用Intersect
的{{1}}代替O(n ^ 2)第一种方法(相当于两个嵌套循环)你可以在O(n)中进行检查:
HashSet<T>
另外,作为附注,您应该将您的类名和属性名称大写以符合C#样式指南。
答案 1 :(得分:0)
这里是一个示例,用于查找另一个列表中是否有匹配元素
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 :(得分:0)
如果两个列表都太大,并且当我们使用lamda表达式时,提取将花费很长时间。在这种情况下最好使用linq来获取参数列表:
var items = (from x in parameters
join y in myStrings on x.Source equals y
select x)
.ToList();