Ok, ich muss testen, ob zwei IEnumerable<T>
gleich sind. Die Reihenfolge der Elemente ist wichtig, was bedeutet, dass:Algorithmus zum Testen der Ungleichheit von geordneten großen Sammlungen
{1, 2, 4, 1, 3} and {1, 2, 1, 3, 4} should not be equal.
Ich habe auf dieser Seite ein paar Antworten gesehen zu erklären, wie dies mit linq
zu tun: zum Beispiel here
Das Problem ist, dass ich immer wieder auf Gleichheit von ziemlich großen Sammlungen (Tausende von Elementen) testen muss, die eine hohe Wahrscheinlichkeit haben, nicht gleich zu sein, so dass die Leistung ein Faktor ist, an den man denken muss. So wie ich es sehe, müssen alle linq
Methoden, die in der erwähnten Antwort gezeigt werden (Count
oder Except
), wenn ich nicht irre, die gesamte Sammlung durchlaufen, was im allgemeinen Fall nicht notwendig ist.
Ich kam mit diesem Code, der ziemlich gut funktioniert (denke ich) und schnell genug ist. Ich habe mich gefragt, ob ich in Art und Weise einige offensichtlich gebaut bin fehlt, dies zu tun (ich will nicht das Rad hier, wenn möglich neu zu erfinden.)
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();
}
}
Sie können 'Enumerable.SequenceEqual' verwenden, das ähnlich Ihrem Code implementiert ist (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs) – Habib
@ CarstenKönig Wie so? IEnumerable scheint eine großartige Idee zu sein, da es die Werte streamen kann (wenn es in einer Weise implementiert wird, die es unterstützt). – Michael
Bitte ändern Sie Ihren Titel und formulieren Sie die "besten und effizientesten" Wörter um, da sie keine Details vermitteln. Für jeden Fall wünscht sich jeder die "besten und effizientesten" Lösungen. Es hängt jedoch stark ** von den genauen Falleinschränkungen ** ab. In Ihrem Fall kommt es auf die "große Sammlung" und "in Ordnung" an. "Beste" ist wirklich ein leeres Wort. Ich schlage etwas wie "Algorithmus zum Testen der Ungleichheit von geordneten großen Zahlensammlungen" usw. vor. – quetzalcoatl