一尘不染

比较两个清单 相等的对象,忽略顺序[重复]

c#

另一个比较列表的问题。

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

我需要检查它们是否具有相同的元素,而不管它们在列表中的位置如何。每个 MyType
对象可能在列表上出现多次。有内置的功能可以检查吗?如果我保证每个元素在列表中仅出现一次怎么办?

编辑: 伙计们感谢您的回答,但我忘了添加一些内容,每个元素的出现次数在两个列表中应该相同。


阅读 281

收藏
2020-05-19

共1个答案

一尘不染

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

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

编辑:

这是一个性能更好(大约快十倍)的解决方案,只需要IEquatable,而不是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);
}

编辑2:

要将任何数据类型作为键来处理(例如,Frank
Tzanabetis指出的可为空的类型),可以创建一个使用字典比较器的版本:

public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) {
  var cnt = new Dictionary<T, int>(comparer);
  ...
2020-05-19