你如何设计一枚举,回报(从理论上说)一个无限量的项目?

StackOverflow https://stackoverflow.com/questions/197297

  •  10-07-2019
  •  | 
  •  

我写的代码类似于这样的:

public IEnumerable<T> Unfold<T>(this T seed)
{
    while (true)
    {
        yield return [next (T)object in custom sequence];
    }
}

显然,这种方法永远不会返回。(C#编译器默默的允许,同时R#给我的警告 "功能永远不会返回".)

一般来说,就是它 糟糕 设计提供一枚举,返回一个无限的数量的项目,而不提供一种方法来阻止列举了?

是否有任何特别的考虑对于这种情况?Mem?Perf?其他陷阱?

如果我们总是提供一个退出的条件,它们是选择吗?例如:

  • 一个目的是T型代表包容或排他的边界
  • 一个 Predicate<T> continue (作为 TakeWhile 不会)
  • 计数(如 Take 不会)
  • ...

我们应该依靠用户叫 Take(...) / TakeWhile(...)Unfold(...)?(可能的选择,因为它充分利用现有的皇宫的知识。)

你会回答这个问题不同,如果代码要将刊登在公共API,无论是因为-是(通用)或者作为具体执行这一模式?

有帮助吗?

解决方案

所以,只要你的文件非常明确的方法将永远不会完成迭代,(该方法本身返回的速度非常快,当然)然后,我认为这很好。事实上,它可以使一些算法更整洁。我不认为有任何明显的记忆/perf影响--尽管如果你指的是"贵"的对象在你迭代,参照将被抓获。

总有办法的滥用药:所以,只要你的文档都清楚,我认为这很好。

其他提示

"一般来说,它是糟糕的设计 提供一枚举,返回 一个无限量的项目,没有 提供一种方法来阻止列举了?"

消费者的代码,可以 总是 停止枚举(使用破例或其他装置)。如果你枚举返回和无限的序列,这并不意味着客户的枚举是某种被迫永远不会打破枚举,实际上你不能让一枚举,这是保证是完全列举的一个客户。

我们应该依靠用户叫 采取(...)/TakeWhile(...)之后 展开(...)?(可能的选的 选项,因为它充分利用现有的 皇宫的知识。)

是的,只要明确指定,在你的文件,该枚举返回和无限序和破枚举的呼叫者的责任,一切都应该被罚款。

回无限的序列是个不错的想法,功能编程语言已经做了很长一段时间了。

我同意乔恩。编译器转变你的方法类执行简单的国家机器,让参照当前价值(即值,将被退回通过当前的财产)。我用这种方法的几次简化码。如果你清楚的文件的方法的行为,它应该只是罚款。

我不会使用无限枚举在公共API。C#程序员,包括我自己,也用于foreach循环。这也将是一致的。净框架;注意到如何可枚举的。范围和可枚举的。重复采取的方法的参数限制的项目数量,在可枚举的。Microsoft选择使用可枚举的。重复("",10),而不是可枚举的。重复("").采取(10)为了避免无限枚举,并且我会坚持自己设计的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top