首页 > 后端开发 > C++ > 如何在 C# 中有效比较两个无序列表是否相等?

如何在 C# 中有效比较两个无序列表是否相等?

Susan Sarandon
发布: 2025-01-21 07:52:08
原创
688 人浏览过

How Can I Efficiently Compare Two Unordered Lists for Equality in C#?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板