首页 > 后端开发 > C++ > 如何有效地比较两个列表的相等性、忽略顺序并允许重复?

如何有效地比较两个列表的相等性、忽略顺序并允许重复?

DDD
发布: 2025-01-21 07:37:10
原创
181 人浏览过

How Can I Efficiently Compare Two Lists for Equality, Ignoring Order and Allowing Duplicates?

比较List对象是否相等

本文探讨如何比较两个List对象是否包含相同的元素,而不考虑元素的顺序。值得注意的是,MyType类型的对象在任一列表中都可能出现多次。

初始方案

为了确保精确的相等性,即两个列表包含相同的元素及其频率,建议在比较之前对列表进行排序:

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

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