47

我有一个List<PropA>

PropA  
{  
    int a;  
    int b;  
}

和另一个List<PropX>

PropX  
{  
    int a;  
    int b;  
}

现在我必须使用 lambda 或 LINQ查找匹配bList<PropX>属性中存在的项目。List<PropA>

4

4 回答 4

78
ListA.Where(a => ListX.Any(x => x.b == a.b))
于 2013-04-02T16:47:43.690 回答
34

你想要做的是Join两个序列。LINQ 有一个Join运算符可以做到这一点:

List<PropX> first;
List<PropA> second;

var query = from firstItem in first
    join secondItem in second
    on firstItem.b equals secondItem.b
    select firstItem;

请注意,JoinLINQ 中的运算符也被编写为执行此操作,这比在第二个集合中对每个项目进行线性搜索的简单实现要高效得多。

于 2013-04-02T16:49:20.047 回答
33
var commonNumbers = first.Intersect(second); 

这将为您提供两个列表之间的公共值,这是一种比 join 或其他 Lambda 表达式更快、更简洁的方法。

就试一试吧。

资料来源:MSDN

于 2014-02-20T10:11:01.227 回答
7

如果您有多个参数,那么以上所有方法都不起作用,所以我认为这是最好的方法。

例如:从 pets 和 pets2 中查找不匹配的项目。

var notMatchedpets = pets
    .Where(p2 => !pets2
    .Any(p1 => p1.Name == p2.Name && p1.age == p2.age))
    .ToList();
于 2014-04-05T19:57:59.757 回答