Não havia, não existe e pode não haver, pelo menos eu acredito que sim. A razão por trás da igualdade de coleção é provavelmente um comportamento definido pelo usuário.
Os elementos das coleções não devem estar em uma ordem específica, embora tenham uma ordem natural, não é nisso que os algoritmos de comparação devem confiar. Digamos que você tenha duas coleções de:
{1, 2, 3, 4}
{4, 3, 2, 1}
Eles são iguais ou não? Você deve saber, mas eu não sei qual é o seu ponto de vista.
Coleções são conceitualmente desordenadas por padrão, até que os algoritmos forneçam as regras de classificação. A mesma coisa que o SQL Server chamará a atenção é quando você tenta fazer paginação, requer que você forneça regras de classificação:
https://docs.microsoft.com/pt-BR/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Mais duas coleções:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
Novamente, eles são iguais ou não? Diz-me tu ..
A repetibilidade de elementos de uma coleção desempenha seu papel em diferentes cenários e algumas coleções, como Dictionary<TKey, TValue>
nem mesmo permitem elementos repetidos.
Acredito que esses tipos de igualdade são definidos por aplicativos e, portanto, a estrutura não forneceu todas as implementações possíveis.
Bem, em casos gerais, Enumerable.SequenceEqual
é bom o suficiente, mas retorna falso no seguinte caso:
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
Eu li algumas respostas para perguntas como essa (você pode pesquisar no Google por elas) e o que eu usaria, em geral:
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);
}
}
Isso significa que uma coleção representa a outra em seus elementos, incluindo tempos repetidos sem levar em consideração o pedido original. Algumas notas da implementação:
GetHashCode()
é apenas para ordenar, não para igualdade; Eu acho que é suficiente neste caso
Count()
realmente não enumera a coleção e se enquadra diretamente na implementação da propriedade ICollection<T>.Count
Se as referências são iguais, é apenas Boris
IList
? A pergunta é ambígua.