我的同事正在查看一个拉取请求,对话围绕着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)
。