2つのコレクションを(C#で)比較したいのですが、これを効率的に実装するための最良の方法がわかりません。
Enumerable.SequenceEqualに関する他のスレッドを読みましたが、私が探しているものとは異なります。
私の場合、2つのコレクションに同じアイテムが含まれている場合(順序に関係なく)、2つのコレクションは等しくなります。
例:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
私が通常行うことは、1つのコレクションの各アイテムをループして他のコレクションに存在するかどうかを確認し、次に他のコレクションの各アイテムをループして最初のコレクションに存在するかどうかを確認することです。(長さを比較することから始めます)。
if (collection1.Count != collection2.Count)
return false; // the collections are not equal
foreach (Item item in collection1)
{
if (!collection2.Contains(item))
return false; // the collections are not equal
}
foreach (Item item in collection2)
{
if (!collection1.Contains(item))
return false; // the collections are not equal
}
return true; // the collections are equal
ただし、これは完全に正しいわけではなく、おそらく2つのコレクションが等しいかどうかを比較する最も効率的な方法ではありません。
私がそれを間違っていると考えることができる例は:
collection1 = {1, 2, 3, 3, 4}
collection2 = {1, 2, 2, 3, 4}
これは私の実装と同じです。各アイテムが見つかった回数をカウントし、両方のコレクションでカウントが等しいことを確認する必要がありますか?
例はある種のC#(疑似C#と呼びましょう)ですが、任意の言語で回答を提供します。問題はありません。
注:例では簡単にするために整数を使用しましたが、参照タイプのオブジェクトも使用できるようにしたいです(オブジェクトの参照のみが比較され、内容は比較されないため、キーとして正しく動作しません)。