比較List
本文探討如何比較兩個List
初始方案
為了確保精確的相等性,即兩個列表包含相同的元素及其頻率,建議在比較之前對列表進行排序:
<code class="language-C#">Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))</code>
最佳化方案
然而,為了提高性能,有人提出了另一個方案:
<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>
這種方法的性能明顯優於初始方案,只需要IEquatable
接口,而不需要IComparable
接口。
處理各種資料型別
為了適應包含不同資料型態(包括可空型別)作為鍵的情況,可以使用改良後的方案:
<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>
以上是如何有效比較兩個列表的相等性、忽略順序並允許重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!