131

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

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

我想遍历参数列表并检查源属性是否等于任何 myStrings 数组。我可以使用嵌套的 foreach 来做到这一点,但我想学习如何以更好的方式做到这一点,因为我一直在玩 linq 并且喜欢可枚举的扩展方法,比如 where 等,所以嵌套的 foreach 感觉不对。是否有更优雅的首选 linq/lambda/delete 方式来执行此操作。

谢谢

4

4 回答 4

274

您可以使用嵌套Any()进行此检查,该检查可用于任何Enumerable

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

在较大的集合上更快地执行将是投影parameterssource然后使用Intersectwhich 在内部使用 a HashSet<T>so 而不是 O(n^2) 对于第一种方法(相当于两个嵌套循环),您可以在 O(n) 中进行检查:

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

此外,作为旁注,您应该将类​​名和属性名大写以符合 C# 样式指南。

于 2012-06-19T00:38:18.973 回答
8

这是一个示例,用于查找另一个列表中是否存在匹配元素

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!");
}
于 2019-02-24T09:38:09.890 回答
2

如果两个列表都太大,并且当我们使用 lamda 表达式时,那么它会花费很长时间来获取。在这种情况下最好使用 linq 来获取参数列表:

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
于 2019-08-30T11:34:11.063 回答
0
list1.Select(l1 => l1.Id).Intersect(list2.Select(l2 => l2.Id)).ToList();
var list1 = await _service1.GetAll();
var list2 = await _service2.GetAll();

// Create a list of Ids from list1
var list1_Ids = list1.Select(l => l.Id).ToList();

// filter list2 according to list1 Ids
var list2 = list2.Where(l => list1_Ids.Contains(l.Id)).ToList();
于 2022-02-12T12:32:44.017 回答