如何表示空集?

时间:2014-02-02 15:03:33

标签: c# math data-structures set set-theory

从集合理论:

  

如果A∩B= {}

,则A,B完全不相交

其中{}为空集

参考:Elementary Set Theory with a Universal Set, by Randall Holmes

此外它说;

  

说不相交的集合A和B具有“无交集”是不正确的;他们确实有一个交集,即空集,但这个交集没有元素

如果A和B不相交,那么A∩B = B∩A = {}

在C#中:

using System.Linq;
...
...

HashSet<string> a = new HashSet<string>(new[] { "a", "b" });
HashSet<string> b = new HashSet<string>(new[] { "d", "c" });

a.Intersect(b) == b.Intersect(a); // => false

为什么?

如果==只是比较对象的ID(相反;如果ab;而不是C#的is运算符),有没有办法代表实际的Empty Set

2 个答案:

答案 0 :(得分:2)

您的Intersect返回IEnumerable<string>。因此,您正在比较IEnumerable的两个实例。正如评论中提到的L.B,您可以使用Any来检查结果IEnumerable<string>是否为空。

bool empty = !a.Intersect(b).Any();

另一种方法是使用HashSet的SetEquals方法。

var ab = new HashSet<string>(a.Intersect(b));

bool equal = ab.SetEquals(b.Intersect(a));

答案 1 :(得分:0)

C#中的==运算符和大多数类似的编程语言并不是你在数学中可以找到的那种平等。它的行为类似于大多数数字,但即使这并不总是正确的(在浮点舍入错误的情况下)。在比较对象时,它是非常不同的。在您的情况下,它只是比较两个对象实例是否完全相同(参见Object.ReferenceEquals),显然它们不一样。 new HashSet<string>()表示空集,但如果键入两次,它们将是两个不同的对象实例。如果愿意,可以定义自己的自定义相等运算符(参见运算符重载)。