58

私はLINQクエリ(または同じことを達成するための他の効率的な手段)で立ち往生しています。別のリストに存在しない、あるリスト内のすべての項目を選択する方法を教えてもらえますか?

基本的に、他の 2 つのリスト間でアイテムを照合して作成したリストがあります。一致するものが見つからなかった最初のリスト内のすべてのアイテムを見つける必要があります。以下の 2 番目の LINQ クエリの星を、この目標を達成するクエリで埋めることができますか? もし私が TSQL を使っていたら、そうするでしょうがSELECT * NOT IN ()、LINQ ではそれができないと思います。

//Create some sample lists.
List<IdentifierLookupData> list1 = new List<IdentifierLookupData> { /*Init */ };
List<IdentifierLookupData> list2 = new List<IdentifierLookupData> { /*Init */ };

//Find all items in list1 and list2 that match and store them in joinItems.
var joinItems = (from d1 in list1
    join d2 in list2 on d1 equals d2
    select d1).ToList<IdentiferLookupData>();

//Find all items in list1 not in joinItems.
var deletedItems = (from d1 in list1
     ***select all items not found in joinItems list.***
4

3 に答える 3

123

.Except拡張メソッド(ドキュメント)を使用してみてください:

var result = list1.Except(list2);

list1は にないのすべてのアイテムを提供しますlist2

重要: メソッドの MSDN ドキュメントへのリンクが提供されていますが、ここでこれを指摘します:Exceptプリミティブ型のコレクションに対してのみそのままで機能し、そのオブジェクトに IEquatable を実装する必要がある POCO/オブジェクトに対してのみ機能します。

于 2012-07-10T17:47:57.993 に答える
11

最も簡単な方法は、Exceptメソッドを使用することです。

var deletedItems = list1.Except(joinItems);

list1これは、含まれていないアイテムのセットを返しますjoinItems

于 2012-07-10T17:46:29.703 に答える