对我来说,似乎任何操作,例如
var list = new List<int>();
// list.Add some elements...
list.Except(anotherList).Intersect(yetAnotherList)
这是否总是与以下内容相同:
list.Intersect(yetAnotherList).Except(anotherList)
我不是100%确定。
谢谢你的帮助。
从纯集合论的角度来看,这里的顺序并不重要。在两个步骤中,你只是从list
中删除元素。如果一个元素在anotherList
中或者不在yetAnotherList
中,那么它将被从列表中删除。在上一句话中交换 »or« 运算符的操作数并没有影响。
为了说明,让我们构造三个列表(这里是集合,因为这些是集合运算):
list = { A, B, C, D }
anotherList = { A, B, E, F }
yetAnotherList = { A, C, E, G }
A
),一个元素分别存在于其他两个集合中,以及一个只存在于该集合而不在其他集合中的元素。因此,我们涵盖了所有可能的交集和集合差的情况。
list.Except(anotherList)
返回 { C, D }
。将其与 yetAnotherList
相交得到 { C }
。
list.Intersect(yetAnotherList)
返回 { A, C }
。去除 anotherList
得到再次返回 { C }
。
Intesect
和Except
都保留了元素的原始顺序 - 因此两个版本得到的结果是相同的。 - undefinedExcept
还是Intersect
都不能保证保留顺序,如果我没有在文档中忽略的话。这是实现它们最简单的算法的结果,但似乎并不被保证。此外,来自list
的任何重复元素都会被合并为单个元素,因为结果在逻辑上是一个集合。所以[1, 2, 1, 3].Except([2]).Intersect([1, 3])
将产生[1, 3]
,所以我不确定在这里讨论结果顺序是否合适。 - undefinedIntersect
保证顺序,但Except
不保证。 - undefined