检查是否列表 包含任何其他列表

问题描述 投票:63回答:2

我有一个像这样的参数列表:

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方法来做到这一点。

谢谢

c# list loops c#-4.0 subset
2个回答
152
投票

您可以使用嵌套的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#样式指南。


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

0
投票

如果列表都太大,当我们使用lambda表达式时,则需要很长时间才能获取。在这种情况下更好地使用linq来获取参数列表:

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.