|
|
1
15
我建议使用相同的IComparer接口,但编写扩展方法,以便将0解释为不相关。在部分排序中,如果元素a和b相等,那么它们的顺序就不重要了,就像wise一样,如果它们不相关,那么您只需要对它们定义了关系的元素进行排序。 下面是一个对偶数和奇数进行部分排序的示例:
结果:4、8、3、5、7、10 |
|
|
2
8
这是我的优化和翻新版本 tehMick 's answer .
我所做的一个改变是
列表
为逻辑列表生成的值。为此,我有两个大小相同的数组。一个包含所有值,另一个包含标志,指示是否已生成每个值。这样,我就避免了必须调整
另一个变化是,在迭代开始时,我只读取一次所有的键。因为我现在想不起来的原因(也许只是我的直觉),我不喜欢打电话给
最后一个接触是参数验证,以及使用隐式键比较器的额外重载。我希望代码可读性足够。过来看。
|
|
|
3
2
嗯,我不确定这种处理方式是最好的方式,但我可能错了。 处理拓扑排序的典型方法是使用一个图,对于每个迭代,删除所有没有入站连接的节点,同时从这些节点中删除所有出站连接。删除的节点是迭代的输出。重复此操作,直到无法删除更多节点。 但是,为了首先获得这些连接,使用您的方法,您需要:
换句话说,该方法的定义可能如下:
然后返回
我正在考虑的问题是“迭代所有组合”部分。也许有更好的方法来处理这个问题,但我看不到。 |
|
|
4
1
我相信
Lasse V. Karlsen's answer
是在正确的轨道上,但我不喜欢隐藏比较方法(或者是一个独立的接口,它不能从
相反,我宁愿看到这样的东西:
这样,您仍然可以实现
但是,它还要求您按照以下方式(类似于
当然,当将此实现传递给任何需要
要完成这个解决方案,您必须提供一个自定义的orderby(以及thenby、orderbyDescending和thenbyDescending)扩展方法,它将接受新的实例参数(正如您已经指出的那样)。实现过程如下所示:
|
|
|
5
1
定义部分订单关系的接口:
我们的目标是返回元素的部分顺序,以尊重枚举。也就是说,我们寻求一个序列
使用深度优先搜索实现拓扑排序的类:
在进行深度优先搜索时将节点标记为已访问需要的帮助程序类:
我没有声称这是算法的最佳实现,但我相信这是正确的实现。此外,我没有返回
该算法通过对添加元素的元素进行深度优先搜索来工作。
例如,考虑在
然后用
这导致排序:
尊重部分秩序。 那很有趣。谢谢。 |
|
|
6
0
非常感谢大家,从埃里克·米克尔森的回答开始,我提出了我的版本,因为我更喜欢使用空值来表示没有关系,如拉塞尔诉卡尔森所说。
然后我有下面的比较器接口
这个助手类
这样可以稍微美化一下用法,这样我的测试就可以如下所示
|