Vergleichsliste
In diesem Artikel wird erläutert, wie zwei List
Erstplan
Um eine exakte Gleichheit zu gewährleisten, d. h. beide Listen enthalten die gleichen Elemente und deren Häufigkeiten, empfiehlt es sich, die Listen vor dem Vergleich zu sortieren:
<code class="language-C#">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
Optimierungsplan
Um die Leistung zu verbessern, hat jedoch jemand eine andere Lösung vorgeschlagen:
<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) { var cnt = new Dictionary<T, int>(); foreach (T s in list1) { if (cnt.ContainsKey(s)) { cnt[s]++; } else { cnt.Add(s, 1); } } foreach (T s in list2) { if (cnt.ContainsKey(s)) { cnt[s]--; } else { return false; } } return cnt.Values.All(c => c == 0); }</code>
Die Leistung dieser Methode ist deutlich besser als die der ursprünglichen Lösung. Sie erfordert nur die IEquatable
-Schnittstelle und nicht die IComparable
-Schnittstelle.
Umgang mit verschiedenen Datentypen
Um sich an die Situation anzupassen, dass unterschiedliche Datentypen (einschließlich nullbarer Typen) als Schlüssel enthalten sind, kann eine verbesserte Lösung verwendet werden:
<code class="language-C#">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) { var cnt = new Dictionary<T, int>(comparer); ... }</code>
Das obige ist der detaillierte Inhalt vonWie kann ich zwei Listen effizient auf Gleichheit vergleichen, dabei die Reihenfolge ignorieren und Duplikate zulassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!