オブジェクトのリストが 2 つあり、そのうちの 1 つはアイテムの数が異なります。今、私がするなら:
var result = list1.Except(list2);
これで、list1 にある項目と list2 にない項目の違いがわかりますね。可能であれば、同じステップでそれらすべてのアイテムを list1 から削除したいと考えています。私がやりたくないのは、「結果」リストをループして list1 から削除する必要があることです。それは可能ですか?
ありがとう!
使用できますList.RemoveAll
:
list1.RemoveAll(t => !list2.Contains(t));
これは、新しいコレクションを作成する必要はありません。また、list1 にはあるが list2 には含まれていないすべての項目を削除するために必要なループは 1 つだけです。ただし、LINQ の仕組みを誤解していると思います。Enumerable.Except
遅延実行を使用して実装されます。つまり、 まで実行されませんforeach
。Except
セットアプローチを使用しているため、大きなリストでも非常に効率的です。
ティムの解決策は正しいですが、実行時間は O(list1.Length * list2.Length) です。適切なハッシュで aを使用するHashSet<T>
と、O(O(list1.Length + list2.Length) ランタイムに近づきます。これはlist2
、一握り以上のアイテムが含まれている場合にはるかに高速です。
私のバリアントの欠点は、ハッシュセットを割り当てる必要があるため、より多くのメモリが必要になることです。
var set2 = new HashSet<T>(list2);
list1.RemoveAll(item=>!set2.Contains(item));