No hubo, no es y podría no ser, al menos eso creo. La razón detrás de esto es la igualdad de colección es probablemente un comportamiento definido por el usuario.
Se supone que los elementos en las colecciones no están en un orden particular, aunque sí tienen un orden natural, no es en lo que deben confiar los algoritmos de comparación. Digamos que tiene dos colecciones de:
{1, 2, 3, 4}
{4, 3, 2, 1}
¿Son iguales o no? Debes saber pero no sé cuál es tu punto de vista.
Las colecciones están conceptualmente desordenadas de forma predeterminada, hasta que los algoritmos proporcionan las reglas de clasificación. Lo mismo que SQL Server le llamará la atención es que cuando intenta hacer paginación, requiere que proporcione reglas de clasificación:
https://docs.microsoft.com/en-US/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
Otras dos colecciones más:
{1, 2, 3, 4}
{1, 1, 1, 2, 2, 3, 4}
De nuevo, ¿son iguales o no? Dígame usted ..
La repetibilidad de elementos de una colección juega su papel en diferentes escenarios y algunas colecciones como Dictionary<TKey, TValue>
ni siquiera permiten elementos repetidos.
Creo que este tipo de igualdad está definida por la aplicación y, por lo tanto, el marco no proporcionó todas las implementaciones posibles.
Bueno, en casos generales Enumerable.SequenceEqual
es lo suficientemente bueno pero devuelve falso en el siguiente 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
Leí algunas respuestas a preguntas como esta (puede buscarlas en Google ) y lo que usaría, en general:
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);
}
}
Eso significa que una colección representa a la otra en sus elementos, incluidos los tiempos repetidos sin tener en cuenta el pedido original. Algunas notas de la implementación:
GetHashCode()
es solo para ordenar, no para la igualdad; Creo que es suficiente en este caso
Count()
realmente no enumera la colección y cae directamente en la implementación de propiedad de ICollection<T>.Count
Si las referencias son iguales, es solo Boris
IList
? La pregunta es ambigua.