【发布时间】:2012-07-24 11:19:26
【问题描述】:
我正在为离散数学设计一个类库,但我想不出一种方法来实现infinite set。
到目前为止,我有一个抽象基类 Set,它实现了 ISet 接口。对于有限集,我派生了一个类 FiniteSet,它实现了每个集合方法。然后我可以这样使用它:
FiniteSet<int> set1 = new FiniteSet<int>(1, 2, 3);
FiniteSet<int> set2 = new FiniteSet<int>(3, 4, 5);
Console.WriteLine(set1); //{1, 2, 3}
Console.WriteLine(set2); //{3, 4, 5}
set1.UnionWith(set2);
Console.WriteLine(set1); //{1, 2, 3, 4, 5}
现在我想表示一个无限集。我的想法是从集合 InfiniteSet 派生另一个抽象类,然后使用该库的开发人员必须从 InfiniteSet 派生来实现自己的类。我会提供常用的集合,例如 N、Z、Q 和 R。
但我不知道如何实现像 Subset 和 GetEnumerator 这样的方法——我什至开始认为这是不可能的。您如何以实用的方式枚举一个无限集,以便您可以将它与另一个无限集相交/联合?如何在代码中检查 N 是 R 的子集?至于基数的问题。嗯,这可能是一个单独的问题。
所有这些使我得出结论,我实现无限集的想法可能是错误的方法。非常感谢您的意见:)。
编辑:为了清楚起见,我还想表示不可数的无限集。
Edit2:我认为重要的是要记住最终目标是实现 ISet,这意味着任何解决方案都必须提供(应该)实现所有 ISet's methods 的方法,其中最成问题的是枚举方法和 IsSubsetOf 方法。
【问题讨论】:
-
使用
yield returnmsdn.microsoft.com/en-us/library/9k7k7cf0.aspx 创建无限集非常简单 -
@asawyer 我真的不明白这与这里的任何问题有什么关系,除了实施枚举 - 这仍然留下了“实际”实施它的问题。
-
使用
yield return创建一个可数无限集很容易。 -
@Daniel Michael 说的。对不起,如果我误解了这个问题。
-
根据定义,你不能枚举一个不可数的集合。如果您愿意放弃枚举,那么实现该集合应该是微不足道的(只需有一个检查成员资格的谓词。交叉点和两个谓词,以及联合或它们)。
标签: c# set set-theory