2012-03-17 128 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