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

![比较两个清单 相等的对象,忽略顺序[重复] 比较两个清单 相等的对象,忽略顺序[重复]](http://www.mshxw.com/aiimages/31/442849.png)
