2012-03-17 14 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)); 

正確なラムダエクスプレスについてのあなたの提案上記の質問のイオン?

+0

可能重複(http://stackoverflow.com/questions/5091922/how-to-subtract-one-huge-list-from-another-efficiently-で-Cシャープ) – richardtallent

答えて

14

3つのオプション。変更せずに一つ:

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(); 

するか、IDによって比較IEqualityComparer<MyType>を書き込み、使用:

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

秒第3の選択肢は、特にあなたがいろいろなところでこの種の仕事をする必要がある場合には、間違いなくより良いIMOです。 [効率的にC#でから別の巨大なリストを減算する方法]の

+0

私は後者のオプションを同意クリーナーですが、最初のオプションは、 'excludeList'項目の非自明な数を持っている場合にパフォーマンスが向上しないのだろうか? – richardtallent

+0

@richardtallentは:いや、 'のでExcept'はとにかく、内部で設定されたハッシュを構築します。 –

関連する問題