比较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中文网其他相关文章!