2012-03-17 114 views
2

从另一个排除集合这是我喜欢的类型:由拉姆达

public class myType 
{ 
    public int Id { get; set; } 
    public string name { get; set; } 
} 

而且还有2集这种类型的:

List<myType> FristList= //fill ; 
List<myType> Excludelist= //fill; 

,我需要从FristList类似下面的排除Excludelist

List<myType> targetList = 
FirstList.Where(m=>m.Id not in (Excludelist.Select(t=>t.Id)); 

什么是你的建议关于确切的lambda快递上述查询的离子?

+0

可能的重复[如何从另一个有效的C#中减去一个巨大的列表](http://stackoverflow.com/questions/5091922/how-to-subtract-one-huge-list-from-another-efficiently- in-c-sharp) – richardtallent 2012-03-17 07:26:30

回答

14

三个选项。一个没有任何变化:

var excludeIds = new HashSet<int>(excludeList.Select(x => x.Id)); 
var targetList = firstList.Where(x => !excludeIds.Contains(x.Id)).ToList(); 

可替换地,无论是覆盖EqualsGetHashCode和使用:

var targetList = firstList.Except(excludeList).ToList(); 

或写入IEqualityComparer<MyType>它通过的ID进行比较,并使用:

var targetList = firstList.Except(excludeList, comparer).ToList(); 

第二而第三种选择绝对是更好的IMO,特别是如果你需要在不同的地方做这种工作的话。

+0

我同意后面的选项比较干净,但是如果'excludeList'中有一些不重要的项目,第一个选项会不会更好? – richardtallent 2012-03-17 08:01:20

+0

@richardtallent:不可以,因为'Except'无论如何都会在内部建立一个哈希集合。 – 2012-03-17 08:14:43