从列表中查找存在于另一个列表中的项目

don*_*ack 36 c# linq collections lambda

我有一个 List<PropA>

PropA  
{  
    int a;  
    int b;  
}
Run Code Online (Sandbox Code Playgroud)

和另一个 List<PropX>

PropX  
{  
    int a;  
    int b;  
}
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*ong 65

ListA.Where(a => ListX.Any(x => x.b == a.b))
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我进行了一个简单的测试,并且"Join"的结果*基本上*更快.http://ideone.com/xW1CnL.您需要自己运行代码才能使用更大的数据集. (2认同)

Ser*_*rvy 30

你想要做的是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;
Run Code Online (Sandbox Code Playgroud)

请注意,JoinLINQ 中的运算符也被编写为比通过第二个集合对每个项目进行线性搜索的简单实现更有效地执行此操作.

  • 还有另外一种写这个的方法......`first.Join(第二,f => fb,s => sb,(fir,sec)=> fir);` (7认同)

Amb*_*buj 26

var commonNumbers = first.Intersect(second); 
Run Code Online (Sandbox Code Playgroud)

这将为您提供两个列表之间的公共值,更快更清晰的方法然后加入或其他Lambda表达式.

就试一试吧.

资料来源:MSDN

  • 只有当`T`与'IEnumerable <T>`集合的类型相同时,这才有效,但问题并非如此. (8认同)

Sac*_*sad 6

如果您有多个参数,以上所有内容都无效,所以我认为这是最好的方法.

例如:找到宠物和宠物不匹配的物品2.

var notMatchedpets = pets
    .Where(p2 => !pets2
    .Any(p1 => p1.Name == p2.Name && p1.age == p2.age))
    .ToList();
Run Code Online (Sandbox Code Playgroud)