交集和并集操作的顺序是否总是可以忽略?

3

对我来说,似乎任何操作,例如

var list = new List<int>();
// list.Add some elements...
list.Except(anotherList).Intersect(yetAnotherList)

这是否总是与以下内容相同:

list.Intersect(yetAnotherList).Except(anotherList)

我不是100%确定。

谢谢你的帮助。

1个回答

2

从纯集合论的角度来看,这里的顺序并不重要。在两个步骤中,你只是从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 }

1
还应该注意到,IntesectExcept都保留了元素的原始顺序 - 因此两个版本得到的结果是相同的。 - undefined
1
@Joey "没有yetAnotherList中的所有元素,也没有不在yetAnotherList中的所有元素"将不会产生任何结果。 - undefined
1
decPL: 啊,现在有意思了。我把这个评论当作对我的措辞使用双重否定的抱怨,而不是实际的事实错误。 - undefined
@decPL:关于元素的顺序,这是一个棘手的问题。无论是Except还是Intersect都不能保证保留顺序,如果我没有在文档中忽略的话。这是实现它们最简单的算法的结果,但似乎并不被保证。此外,来自list的任何重复元素都会被合并为单个元素,因为结果在逻辑上是一个集合。所以[1, 2, 1, 3].Except([2]).Intersect([1, 3])将产生[1, 3],所以我不确定在这里讨论结果顺序是否合适。 - undefined
1
啊,Intersect保证顺序,但Except不保证。 - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接