Enumerable.SequenceEqual(list1,list2)相对于list1.All(list2.Cont



我的同事正在查看一个拉取请求,对话围绕着Enumerable.SequenceEqual(list1, list2)list1.All(list2.Contains)展开——在这种情况下,两个列表都是strings。但我不会把问题局限于string

Enumerable.SequenceEqual(list1, list2)list1.All(list2.Contains)相比有哪些优点和缺点

可以说,这是基于意见的,但潜在的机制是不同的,其中一种机制在某些情况下应该表现得更好,也应该有其他更适合的细微差别。

p.S我更喜欢Enumerable.SequenceEqual,因为它能更好地描述它的功能。

SequenceEqual方法确定两个IEnumerable序列是否以相同的顺序包含相同的对象。因此,您必须对对象进行排序,然后调用SequenceEqual。不幸的是,这个解决方案需要以某种方式对项目进行排序,而这可能并不总是可能的。或者使用ComparableSequenceEqual<T>(this IEnumerable<T> list1, IEnumerable<T> list2)这样的扩展。

为了进入SequenceEqual,我在这里有两个例子。

这将返回true

Pet pet1 = new Pet { Name = "Turbo", Age = 2 };
Pet pet2 = new Pet { Name = "Peanut", Age = 8 };
List<Pet> pets1 = new List<Pet> { pet1, pet2 };
List<Pet> pets2 = new List<Pet> { pet1, pet2 };
bool equal = pets1.SequenceEqual(pets2);

这将返回false:

Pet pet1 = new Pet() { Name = "Turbo", Age = 2 };
Pet pet2 = new Pet() { Name = "Peanut", Age = 8 };
List<Pet> pets1 = new List<Pet> { pet1, pet2 };
List<Pet> pets2 = new List<Pet> 
{ 
new Pet { Name = "Turbo", Age = 2 },
new Pet { Name = "Peanut", Age = 8 } 
};
bool equal = pets1.SequenceEqual(pets2);

这些序列包含相同的数据,但由于它们包含的对象具有不同的引用,因此这些序列不被视为相同。

由于我不完全了解您的用例,我宁愿继续使用第二个选项list1.All(list2.Contains)

相关内容

最新更新