Ich finde Kathys Ansatz gut. Ich würde persönlich den Vergleichenden ausdrücklich angeben lassen:
bool AreEqual(T[] a, T[] b)
{
return AreEqual(a, b, EqualityComparer.Default);
}
bool AreEqual(T[] a, T[] b, IEqualityComparer comparer)
{
// Handle identity comparison, including comparing nulls
if (a == b)
{
return true;
}
if (a == null || b == null)
{
return false;
}
if(a.Length != b.Length)
{
return false;
}
for(int i = 0; i < a.Length; i++)
{
if(!comparer.Equals(a[i], b[i]))
{
return false;
}
}
return true;
}
SequenceEqual wie von CMS erwähnt ist gut, aber aufgrund seiner Verallgemeinerung über IEnumerable
glaube ich nicht, dass er das "early out" machen kann, wenn die Längen nicht übereinstimmen. (Es ist möglich, dass er beide Sequenzen überprüft, die IList implementieren, um direkt die Count zu prüfen.) Sie könnten noch etwas mehr verallgemeinern, um IList
zu verwenden
bool AreEqual(IList a, IList b, IEqualityComparer comparer)
{
if(a.Count != b.Count)
{
return false;
}
for(int i = 0; i < a.Count; i++)
{
if(!comparer.Equals(a[i], b[i]))
{
return false;
}
}
return true;
}
Die direkte Array-Version wird wahrscheinlich am effizientesten sein - die Hinzufügung von Allgemeinheit und Abstraktion beeinträchtigt in der Regel die Leistung, obwohl es darauf ankommt, ob es für Ihre Anwendung signifikant ist.
2 Stimmen
Sie könnten auch ein frühes Beenden hinzufügen, wenn sie referenzgleich sind.