2 つのコレクションを (C# で) 比較したいのですが、これを効率的に実装する最善の方法がわかりません。
Enumerable.SequenceEqualに関する他のスレッドを読みましたが、それはまさに私が探しているものではありません。
私の場合、両方に同じアイテムが含まれている場合、2 つのコレクションは等しくなります (順序に関係なく)。
例:
collection1 = {1, 2, 3, 4};
collection2 = {2, 4, 1, 3};
collection1 == collection2; // true
私が通常行うことは、あるコレクションの各アイテムをループして、それが他のコレクションに存在するかどうかを確認し、次に他のコレクションの各アイテムをループして最初のコレクションに存在するかどうかを確認することです。(長さを比較することから始めます)。
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# と呼びましょう) で書かれていますが、どの言語で答えてもかまいません。
注:簡単にするために例では整数を使用しましたが、参照型オブジェクトも使用できるようにしたいと考えています (内容ではなくオブジェクトの参照のみが比較されるため、これらはキーとして正しく動作しません)。