2つの一般的なリストの違いを比較する最も簡単な方法 質問する

2つの一般的なリストの違いを比較する最も簡単な方法 質問する

2 つの大規模なリスト (>50,000 項目) を比較し、結果として以下のような 2 つのリストを作成する最も速い (かつ最もリソースを消費しない) 方法は何ですか。

  1. 最初のリストには表示されるが、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]。多くの場合、これは問題にはなりませんが、知っておく価値はあります。

おすすめ記事