- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在思考IEnumerator.Reset()
方法。我在 MSDN 文档中读到它仅用于 COM 互操作。作为一名 C++ 程序员,它看起来像一个支持 Reset
的 IEnumerator
,我称之为 forward iterator。 , 而不支持 Reset
的 IEnumerator
实际上是一个 input iterator .
所以我的问题的第一部分是,这种理解是否正确?
我的问题的第二部分是,如果在输入迭代器和前向迭代器(或“枚举器”,如果您愿意)之间有所区别,这对 C# 有什么好处吗?它不会有助于消除程序员之间的一些困惑,就像在这个 SO question about cloning iterators 中发现的那样吗? ?
编辑:对前向和输入迭代器的澄清。输入迭代器仅保证您只能枚举集合的成员(或来自生成器函数或输入流)一次。这正是 IEnumerator 在 C# 中的工作方式。是否可以枚举第二次,取决于是否支持Reset
。前向迭代器没有此限制。您可以根据需要多次枚举成员。
一些 C# 程序员不理解为什么不能在多 channel 算法中可靠地使用 IEnumerator
。考虑以下情况:
void PrintContents(IEnumerator<int> xs)
{
while (iter.MoveNext())
Console.WriteLine(iter.Current);
iter.Reset();
while (iter.MoveNext())
Console.WriteLine(iter.Current);
}
如果我们在此上下文中调用 PrintContents
,没问题:
List<int> ys = new List<int>() { 1, 2, 3 }
PrintContents(ys.GetEnumerator());
但是请看以下内容:
IEnumerable<int> GenerateInts() {
System.Random rnd = new System.Random();
for (int i=0; i < 10; ++i)
yield return Rnd.Next();
}
PrintContents(GenerateInts());
如果 IEnumerator
支持 Reset
,换言之支持多遍算法,那么每次迭代集合时都会有所不同。这将是不可取的,因为这将是令人惊讶的行为。这个例子有点假,但它确实发生在现实世界中(例如从文件流中读取)。
最佳答案
Reset
是个大错误。我调用恶作剧 Reset
.在我看来,反射(reflect)您在 .NET 类型系统中“前向迭代器”和“输入迭代器”之间的区别的正确方法是区分 IEnumerable<T>
。和 IEnumerator<T>
.
另见 this answer ,Microsoft 的 Eric Lippert(毫无疑问,以非官方身份,我的观点只是他的资历比我声称这是设计错误的资历更多)在评论中提出了类似的观点。另见 his awesome blog .
关于c# - C# 是否会受益于枚举器种类之间的区别,例如 C++ 迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634934/
我是一名优秀的程序员,十分优秀!