2 つの大規模なリスト (>50,000 項目) を比較し、結果として以下のような 2 つのリストを作成する最も速い (かつ最もリソースを消費しない) 方法は何ですか。
- 最初のリストには表示されるが、2 番目のリストには表示されないアイテム
- 2 番目のリストには表示されるが、最初のリストには表示されないアイテム
現在、私はリストまたは IReadOnlyCollection を使用しており、この問題を linq クエリで解決しています。
var list1 = list.Where(i => !list2.Contains(i)).ToList();
var list2 = list2.Where(i => !list.Contains(i)).ToList();
しかし、これは私が望むほどのパフォーマンスを発揮しません。多くのリストを処理する必要があるため、これをより高速にし、リソースの消費を抑えるアイデアはありますか?
ベストアンサー1
使用Except
:
var firstNotSecond = list1.Except(list2).ToList();
var secondNotFirst = list2.Except(list1).ToList();
実際にはこれよりわずかに速いアプローチもあると思いますが、それでもO(N * M) アプローチよりはるかに高速になります。
これらを組み合わせる場合は、上記のメソッドと return ステートメントを作成します。
return !firstNotSecond.Any() && !secondNotFirst.Any();
注意すべき点の 1 つは、質問の元のコードとここでの解決策の間に結果の違いがあることです。1つのリストにのみ存在する重複要素は、私のコードでは 1 回しか報告されませんが、元のコードでは発生した回数だけ報告されます。
たとえば、[1, 2, 2, 2, 3]
とのリストの場合[1]
、元のコードでは「要素は list1 にあり、list2 にはない」という結果は になります[2, 2, 2, 3]
。私のコードでは、単に になります[2, 3]
。多くの場合、これは問題にはなりませんが、知っておく価値はあります。