另一个列表比较问题。
List<MyType> list1; List<MyType> list2;
我需要检查它们是否具有相同的元素,无论它们在列表中的位置如何。每个 MyType 对象可能在列表中出现多次。是否有一个内置函数可以检查这个?如果我保证每个元素在列表中只出现一次怎么办?
编辑: 伙计们感谢您的回答,但我忘了添加一些内容,两个列表中每个元素的出现次数应该相同。
如果您希望它们真正相等(即相同的项目和每个项目的相同数量),我认为最简单的解决方案是在比较之前进行排序:
Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))
这是一个性能更好的解决方案(大约快十倍),并且只需要IEquatable,而不是IComparable:
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); }
要将任何数据类型作为键处理(例如 Frank Tzanabetics 指出的可空类型),您可以制作一个使用字典比较器的版本:
public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2, IEqualityComparer<T> comparer) { var cnt = new Dictionary<T, int>(comparer); ...