Ok, muszę sprawdzić, czy dwa IEnumerable<T>
są równe. Kolejność elementów jest ważne, co oznacza, że:Algorytm testowania nierówności zamówionych dużych kolekcji
{1, 2, 4, 1, 3} and {1, 2, 1, 3, 4} should not be equal.
Widziałem kilka odpowiedzi na tej stronie wyjaśniające w jaki sposób to zrobić z linq
na przykład: here
Problemem jest to, że muszę wielokrotnie testować pod kątem równości całkiem dużych kolekcji (tysięcy elementów), które mają duże prawdopodobieństwo, że nie będą równe, więc wydajność jest czynnikiem, o którym trzeba pamiętać. Sposób, w jaki go widzę, wszystkie metody przedstawione w odpowiedzi (Count
lub Except
) muszą, jeśli się nie mylę, iterować przez cały zbiór, który w ogólnym przypadku nie jest konieczny.
Wpadłem na ten kod, który działa dość dobrze (jak sądzę) i jest wystarczająco szybki. Zastanawiałem się, czy jestem brakuje niektórych oczywiste, zbudowany w zasadzie robi to (nie chcę wyważać otwartych drzwi tutaj, jeśli to możliwe.)
public static bool IsEqualTo<T>(this IEnumerable<T> inner, IEnumerable<T> other) where T: IEquatable<T>
{
if (inner == null)
throw new ArgumentNullException();
if (object.ReferenceEquals(inner, other))
return true;
if (object.ReferenceEquals(other, null))
return false;
using (var innerEnumerator = inner.GetEnumerator())
using (var otherEnumerator = other.GetEnumerator())
{
while (innerEnumerator.MoveNext())
{
if (!otherEnumerator.MoveNext() || !innerEnumerator.Current.Equals(otherEnumerator.Current))
return false;
}
return !otherEnumerator.MoveNext();
}
}
Możesz użyć 'Enumerable.SequenceEqual', który jest zaimplementowany podobnie do twojego kodu (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs) – Habib
@ CarstenKönig Jak to zrobić? IEnumerable wydaje się świetnym pomysłem, ponieważ może przesyłać strumieniowo wartości (jeśli są zaimplementowane w sposób, który je obsługuje). – Michael
Proszę zmienić tytuł i zmienić sformułowanie "najlepsze i wydajne", ponieważ nie zawierają żadnych szczegółów. W każdym przypadku każdy chce "najlepszych i najskuteczniejszych" rozwiązań. Jednak mocno ** zależy od dokładnych ograniczeń **. W twoim przypadku liczy się "wielki zbiór" i "porządek". "najlepszy" to naprawdę puste słowo. Sugeruję coś takiego jak "Algorytm testowania nierówności zamówionych dużych kolekcji liczb" itd. – quetzalcoatl