【发布时间】:2019-03-25 18:54:07
【问题描述】:
我有以下课程:
class CopyProvider<T> where T: IMyCloneable
{
private readonly T _original;
public CopyProvider(T original) => _original = original;
public T Current { get; private set; }
public bool MoveNext()
{
Current = _original.Clone();
return true;
}
}
现在我想知道将此类声明为IEnumerator<T> 的实现是否是一个好习惯。从句法上看,CopyProvider 确实符合要求,但会不会违反IEnumerator 语义?
或者,我也可以编写以下方法:
IEnumerable<T> ProvideCopies<T>(T original) where T: IMyCloneable
{
while(true)
yield return original.Clone();
}
确实,这样会舒服得多。但是,我又遇到了同样的问题:IEnumerable 的这种用法会破坏接口的语义吗?
或者我应该考虑使用InfiniteEnumerator 和/或InfiniteEnumerable 实现一个单独的对象结构?但是,这会阻止我使用像 yield 和 foreach 这样的 C# 语法糖。
我期待您的建议。
【问题讨论】:
-
为什么/什么会违反接口?另外,
InfiniteEnumerator对我来说毫无意义,为什么它会是无限的? -
@CamiloTerevinto 为什么会是无限的? - 因为
IEnumerator.MoveNext()永远不会返回假。合法用途可能是来自How do you create an enumeration of random values? 的随机值的枚举器。你可以做类似random.GetRandomValues().TakeWhile(i => (some condition))的事情。无论如何,这个问题似乎主要基于我的意见,或者可能是 Is an infinite enumerable still “enumerable”? 的副本。
标签: c# .net oop ienumerable ienumerator