Si no se preocupan por los duplicados (es decir, se consideraría {1, 2, 3}
a ser igual a {1, 2, 3, 2}
) a continuación:
new HashSet<int>(A).SetEquals(B)
(O cualquier tipo es el elemento escriba en lugar de int
).
De lo contrario:
public static bool SequenceEqualUnordered<T>(IEnumerable<T> first, IEnumerable<T> second)
{
if (first == null)
return second == null; // or throw if that's more appropriate to your use.
if (second == null)
return false; // likewise.
var dict = new Dictionary<T, int>(); // You could provide a IEqualityComparer<T> here if desired.
foreach(T element in first)
{
int count;
dict.TryGetValue(element, out count);
dict[element] = count + 1;
}
foreach(T element in second)
{
int count;
if (!dict.TryGetValue(element, out count))
return false;
else if (--count == 0)
dict.Remove(element);
else
dict[element] = count;
}
return dict.Count == 0;
}
llevar la cuenta de cada elemento de la primera secuencia, a continuación, comprobar la segunda contra ella. En el momento en que tenga demasiados en la segunda secuencia, puede devolver el resultado falso; de lo contrario, si no le queda nada en el diccionario de recuentos, son iguales o falsos si quedan elementos.
En lugar de los dos tipos O (n log n) de usar OrderBy()
seguidos por la comparación O (n), tiene una operación O (n) que genera el conjunto de recuentos, y un O (n) verificación contra eso.
posible duplicado de [Comparación de dos colecciones para la igualdad independientemente del orden de los elementos en ellas] (http://stackoverflow.com/questions/50098/comparing-two-collections-for-equality-irrespective-of-the- order-of-items-in-the) – nawfal