比较两个List对象的相等性,忽略顺序。
比较两个List
这个问题的出现原因是问题陈述不清晰。陈述中的句子:
"... they both have the same elements, regardless of their position within the list.
Each MyType object may appear multiple times on a list. "
无法确定您是希望确保这两个列表具有相同的对象集合还是相同的不同对象集合。
如果您希望确保这两个集合具有完全相同的成员,无论顺序如何,可以使用以下代码:
// 列表应具有相同的项数,并且集合差异必须为空 var areEquivalent = (list1.Count == list2.Count) && !list1.Except(list2).Any();
如果您希望确保这两个集合具有相同的不同成员(忽略重复项),可以使用以下代码:
// 检查 [(A-B) Union (B-A)] 是否为空 var 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 }; // 结果应为true,因为这两个集合是等价的... var areEquivalent = (a.Count() == b.Count()) && !a.Except(b).Any();
第一种方法在以下情况下不适用:a = new[] {1,5,5}
和 b = new[] {1,1,5}
。这两个集合的成员集合不是完全相同的,但areEquivalent
被设置为true
。
Jansen是对的,使用!a.Except(b).Any()的方法存在错误,它会认为a={2,2}和b={1,2}是相等的。我想知道它是如何获得这么多的赞同票的?
这个答案没有考虑到数量可以相同,并且except可以匹配,但列表仍然可能不同:{ 1,1,2,2,3,3 } != { 1,2,3,4,5,6 }
即使在相反的方向上执行.Except(...)
也无法解决问题:{ 1,1,2,3 } != { 1,2,2,3 }
在这里,您可以找到基于这个答案的集合比较的扩展方法,修复了这里的评论中提到的问题:[stackoverflow.com/a/67486151/379279](https://stackoverflow.com/a/67486151/379279)
问题:如何比较两个List
原因:在某些情况下,我们需要比较两个List
解决方法:一个简单的解决方法是使用HashSet。HashSet是一种集合类型,它可以快速检索、插入和删除元素。我们可以将两个List对象转换为HashSet对象,然后比较它们是否相等。
代码示例:
var set1 = new HashSet(list1); var set2 = new HashSet (list2); return set1.SetEquals(set2);
需要注意的是,为了使用HashSet进行比较,我们需要在MyType类中重写GetHashCode方法,并实现IEquatable
public class MyType : IEquatable{ // Other members of MyType public override int GetHashCode() { // Implement the GetHashCode method } public bool Equals(MyType other) { // Implement the Equals method } }
此外,还需要注意的是,HashSet要求我们实现Equals方法。在比较两个对象时,HashSet会比较它们的哈希码和Equals方法的返回值。
需要注意的是,以上方法只适用于不考虑重复元素的情况。如果我们需要考虑重复元素的情况,那么上述方法将不适用。
另外,我们还可以使用其他方法来比较两个List对象的相等性,但是这些方法也需要实现Equals方法。
通过使用HashSet,我们可以忽略元素的顺序,比较两个List对象的相等性。我们需要在MyType类中重写GetHashCode方法,并实现IEquatable
比较两个List
在这段代码中,提供了两种解决方法来比较两个List
第一种方法是使用OrderBy对两个列表进行排序,然后使用Enumerable.SequenceEqual方法进行比较。这种方法简单直接。
第二种方法是使用一个字典来统计每个元素在列表中出现的次数,然后逐个比较两个列表中的元素。这种方法在性能上比第一种方法更好,但需要确保T类型实现了IEquatable接口。
如果T类型是可比较的(实现了IComparable接口),可以使用第一种方法;如果T类型没有实现IComparable接口,可以使用第二种方法,只需要确保实现了正确的GetHashCode和Equals方法。
为了处理任意数据类型作为键(例如可空类型),可以通过为字典提供一个比较器来实现。这样字典就能处理任意类型的键。
在使用字典进行比较时,需要注意处理空值的情况。如果键的类型是可空的,传入的集合中有空值会导致比较失败。
另外,可以对两个列表的元素数量进行比较。如果两个列表的元素数量不同,它们肯定不相等,可以直接返回false,避免进行不必要的元素比较。
最后,通过使用Stopwatch类来计时比较操作,可以减少其他因素对比较时间的影响。
这段代码提供了两种解决方法来比较两个List