Wenn Sie sich nicht um Duplikate kümmern (d. h. Sie würden die {1, 2, 3}
gleichzusetzen mit {1, 2, 3, 2}
) dann:
new HashSet<int>(A).SetEquals(B)
(Oder welcher Typ auch immer der Elementtyp ist anstelle von int
).
Ansonsten:
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;
}
Notieren Sie jedes Element der ersten Sequenz und vergleichen Sie dann die zweite mit ihr. In dem Moment, in dem Sie ein Element zu viel in der zweiten Sequenz haben, können Sie false zurückgeben, andernfalls, wenn Sie nichts mehr im Wörterbuch der Zählungen haben, sind sie gleich, oder false, wenn es irgendwelche Elemente übrig gibt.
Anstelle der beiden O(n log n)-Arten der Verwendung von OrderBy()
gefolgt von einem O(n)-Vergleich, haben Sie eine O(n)-Operation, die die Menge der Tallies aufbaut, und eine O(n)-Prüfung gegen sie.