ありませんでしたし、そうでなかったかもしれませんが、少なくとも私はそう信じています。背後にある理由は、コレクションの同等性がおそらくユーザー定義の動作であるためです。
コレクション内の要素は特定の順序になっているとは限りませんが、自然に順序付けされているため、比較アルゴリズムがこれに依存するべきではありません。次の2つのコレクションがあるとします。
{1, 2, 3, 4}
{4, 3, 2, 1}
彼らは等しいかどうか?あなたは知っている必要がありますが、私はあなたの視点が何であるかわかりません。
アルゴリズムがソート規則を提供するまで、コレクションは概念的にデフォルトで順序付けされていません。SQLサーバーがあなたに注意を喚起するのと同じことは、ページネーションを行おうとするときに、ソート規則を提供する必要があります。
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
さらに別の2つのコレクション:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
もう一度、彼らは等しいかどうか?教えてください ..
コレクションの要素の再現性は、さまざまなシナリオでその役割を果たし、一部のコレクションでDictionary<TKey, TValue>
は、要素の繰り返しさえ許可していません。
これらの種類の平等はアプリケーションで定義されているため、フレームワークは可能な実装のすべてを提供しなかったと思います。
まあ、一般的なケースでEnumerable.SequenceEqual
は十分ですが、次のケースではfalseを返します:
var a = new Dictionary<String, int> { { "2", 2 }, { "1", 1 }, };
var b = new Dictionary<String, int> { { "1", 1 }, { "2", 2 }, };
Debug.Print("{0}", a.SequenceEqual(b)); // false
私はこのような質問へのいくつかの回答(あなたはそれらのためにグーグルするかもしれません)と私が一般的に使用するものを読みました:
public static class CollectionExtensions {
public static bool Represents<T>(this IEnumerable<T> first, IEnumerable<T> second) {
if(object.ReferenceEquals(first, second)) {
return true;
}
if(first is IOrderedEnumerable<T> && second is IOrderedEnumerable<T>) {
return Enumerable.SequenceEqual(first, second);
}
if(first is ICollection<T> && second is ICollection<T>) {
if(first.Count()!=second.Count()) {
return false;
}
}
first=first.OrderBy(x => x.GetHashCode());
second=second.OrderBy(x => x.GetHashCode());
return CollectionExtensions.Represents(first, second);
}
}
つまり、元の順序を考慮せずに、1つのコレクションが繰り返し要素を含む要素で他のコレクションを表しています。実装に関する注意事項:
IList
?質問があいまいです。