web-dev-qa-db-ja.com

LINQ-あるリスト内で、別のリストにないすべてのアイテムを検索する

私は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.***

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

var result = list1.Except(list2);

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

99
Dimitri

これを試して:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));
15

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

var deletedItems = list1.Except(joinItems);

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

11
JaredPar