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