0

从集合论:

如果 A∩B = {},则集合 A,B 完全不相交

其中 {} 是空集

参考:具有通用集合的基本集合论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;不是isC# 的运算符),有没有办法表示实际Empty Set

4

2 回答 2

4

你的Intersect回报IEnumerable<string>。因此,您正在比较 IEnumerable 的两个实例。正如评论中提到的LB,您可以使用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));
于 2014-02-02T15:18:13.113 回答
0

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

于 2014-02-02T15:22:59.040 回答