2013-01-07 9 views
9

2つのリストがあります。 LIST2に存在しないアイテムをLIST1から削除したい例えばのでLINQは2つのリストを比較して削除します

:実行list1

 var list1 = new List<DownloadTask>(); 
     list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

     var list2 = new List<DownloadTask>(); 
     list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

だけのアイテムが含まれています組み合わせoperationId = 1machineId = 1OperationId = 3MachineId =2で。

+0

つまり、これら2つのリストの共通要素のセットを調べる必要があります。 – user3454439

答えて

13

DownloadTaskオーバーライドEqualsGetHashCode正しくしていますか?もしそうなら、あなたが必要なのは次のとおりです。あなたはもちろん、新しいリストを作成させていただきます場合だ

list1 = list1.Intersect(list2).ToList(); 

。あなたが本当にそれらを既存のリストから削除したいのであれば、やや難しいです。それは恐らく結果は、次のようになり、クリアして再追加すべきかをうまくするのが最も簡単でしょう:

もちろん
var newList = list1.Intersect(list2).ToList(); 
list1.Clear(); 
list1.AddRange(newList); 

、こののすべてがDownloadTaskに適切平等を実装する必要がない - しかし、もしあなたはまだそれをしていない、そうすることは良い考えであるように聞こえる。 (あるいは、少なくともどこかIEqualityComparer<DownloadTask>を実装する - 。あなたはIntersectに比較子を渡すことができます)

を注意点として、私は、ビューの簡単な方法として(すなわち交差点)「のみlist2でもあるlist1の要素を保ちます」 「list2にないlist1からすべての要素を取り除く」よりも問題を見ています。後者は基本的には二重否定であり、常に痛みです。

16

は、私はそれがあるべきだと思う:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID)); 
+0

ありがとうございます、本当に満足しているコード行です。 – Avishek

5
var lst = (from lst1 in list1 
      where !list2.Any(
           x => x.OperationID == lst1.OperationID && 
            x.MachineID == lst1.MachineID) 
      select lst1).ToList(); 

    list1 = lst.ToList(); 

これを試してください。

+0

It's Works ... Thnak you ..... –

関連する問題