比较两个List<T>对象是否相等,忽略顺序还有一个清单-比较问题。List<MyType> list1;List<MyType> list2;我需要检查它们是否具有相同的元素,而不管它们在列表中的位置如何。各MyType对象可能多次出现在列表中。有没有一个内置的函数来检查这个?如果我保证每个元素只在一个列表中出现一次呢?
3 回答
慕森王
TA贡献1777条经验 获得超3个赞
如果您希望它们是真正相等的(即相同的项和每个项的数目),我认为最简单的解决方案是在比较之前进行排序:
Enumerable.SequenceEqual(list1.OrderBy(t => t), list2.OrderBy(t => t))
编辑:
下面是一个性能更好的解决方案(大约快10倍),并且只需要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); ...
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
..无论它们在列表中的位置如何,它们都有相同的元素。每个MyType对象可能在列表中出现多次。
// lists should have same count of items, and set difference must be emptyvar areEquivalent = (list1.Count == list2.Count) && !list1.Except(list2).Any();
// check that [(A-B) Union (B-A)] is emptyvar areEquivalent = !list1.Except(list2).Union( list2.Except(list1) ).Any();
Intersect
, Union
, Except
Contains
编辑:
var a = new[] {1, 2, 3, 4, 4, 3, 1, 1, 2};var b = new[] { 4, 3, 2, 3, 1, 1, 1, 4, 2 };// result below should be true, since the two sets are equivalent...var areEquivalent = (a.Count() == b.Count()) && !a.Except(b).Any();
森栏
TA贡献1810条经验 获得超5个赞
var set1 = new HashSet<MyType>(list1);var set2 = new HashSet<MyType>(list2);return set1.SetEquals(set2);
.GetHashCode()
IEquatable<MyType>
MyType
.
- 3 回答
- 0 关注
- 1699 浏览
添加回答
举报
0/150
提交
取消