比较两个 List 对象是否相等,忽略顺序[重复]

2024-02-20

又一个列表比较问题。

List<MyType> list1;
List<MyType> list2;

我需要检查它们是否具有相同的元素,无论它们在列表中的位置如何。每个MyType对象可能会在列表中出现多次。是否有内置函数可以检查这一点?如果我保证每个元素在列表中只出现一次怎么办?

EDIT:感谢大家的回答,但我忘了添加一些内容,两个列表中每个元素出现的次数应该相同。


如果你希望它们真正相等(即相同的项目和每个项目的相同数量),我认为最简单的解决方案是在比较之前进行排序:

Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))

Edit:

这是一个性能更好一点的解决方案(大约快十倍),并且只需要IEquatable, not IComparable:

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);
}

Edit 2:

要将任何数据类型作为键处理(例如 Frank Tzanabitis 指出的可空类型),您可以制作一个采用comparer http://msdn.microsoft.com/en-us/library/ms132151.aspx对于字典:

public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) {
  var cnt = new Dictionary<T, int>(comparer);
  ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较两个 List 对象是否相等,忽略顺序[重复] 的相关文章

随机推荐