比較無序List
判斷兩個List
如果每個元素出現的次數很重要,一個簡單的解決方案是在比較之前對兩個列表進行排序:
<code class="language-csharp">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
針對IEquatable元素的最佳化方案
對於只需要實作IEquatable介面(而不是IComparable)的元素,有一個更有效的方法:
<code class="language-csharp">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2) { var cnt = new Dictionary<T, int>(); foreach (T s in list1) { cnt[s] = cnt.GetValueOrDefault(s, 0) + 1; } foreach (T s in list2) { if (cnt.ContainsKey(s)) cnt[s] -= 1; else return false; } return cnt.Values.All(x => x == 0); }</code>
此方案計算第一個清單中每個元素出現的次數,然後從第二個清單中減去出現的次數。如果每個計數都達到零,則認為這兩個列表相等。
處理自訂鍵類型
如果元素類型無法比較(例如,可空型別),可以為字典指定比較器:
<code class="language-csharp">public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) { var cnt = new Dictionary<T, int>(comparer); ... }</code>
以上是如何在 C# 中有效比較兩個無序列表是否相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!