返回一个空的 IEnumerator
我有一个接口,除其他外,它实现了“public IEnumerator GetEnumerator()”方法,因此我可以在 foreach 语句中使用该接口。
我在几个类中实现了这个接口,在其中一个类中,我想返回一个空的 IEnumerator。现在我按以下方式执行此操作:
public IEnumerator GetEnumerator()
{
ArrayList arr = new ArrayList();
return arr.GetEnumerator();
}
但是我认为这是一个丑陋的黑客,并且我忍不住认为有更好的方法来返回空的 IEnumerator。有没有?
I have an interface that, among other things, implements a "public IEnumerator GetEnumerator()" method, so I can use the interface in a foreach statement.
I implement this interface in several classes and in one of them, I want to return an empty IEnumerator. Right now I do this the following way:
public IEnumerator GetEnumerator()
{
ArrayList arr = new ArrayList();
return arr.GetEnumerator();
}
However I consider this an ugly hack, and I can't help but think that there is a better way of returning an empty IEnumerator. Is there?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
这在 C# 2 中很简单:
您需要使用 yield break 语句来强制编译器将其视为迭代器块。
这将比“自定义”空迭代器效率低,但它的代码更简单......
This is simple in C# 2:
You need the
yield break
statement to force the compiler to treat it as an iterator block.This will be less efficient than a "custom" empty iterator, but it's simpler code...
框架中有一个额外的函数:
使用它你可以编写:
There is an extra function in the framework:
Using this you can write:
您可以实现一个实现 IEnumerator 的虚拟类,并返回它的一个实例:
You could implement a dummy class that implements IEnumerator, and return an instance of it:
我很好奇,又走得更远。我做了一个测试,检查这些方法比较
yield break
、Enumerable.Emtpy
和自定义类的效率。您可以在 dotnetfiddle https://dotnetfiddle.net/p5ZkUN 上查看或使用下面的代码。
使用 190 000 次迭代进行的众多 dotnetfiddle 运行之一的结果是:
I was curious and went a bit further. I made a test that checks how efficient the methods are comparing
yield break
,Enumerable.Emtpy
and custom class.You can check it out on dotnetfiddle https://dotnetfiddle.net/p5ZkUN or use the code below.
The result of one of the many dotnetfiddle runs using 190 000 iterations was:
我使用的方式是使用空数组的枚举器:
它也可以用于通用 IEnumerator 或 IEnumerable (使用适当类型的数组)
The way I use is to use the enumerator of an empty array:
It can also be used for generic IEnumerator or IEnumerable (use an array of the appropriate type)
您可以实现 IEnumerator 接口和 IEnumerable,并从 IEnumerable 接口的 MoveNext 函数返回 false
You can implement IEnumerator interface and IEnumerable, and return false from MoveNext function of IEnumerable interfase
我是这样写的:
I wrote it like this:
您可以创建一个实现 IEnumerator 接口的 NullEnumerator。您可以仅从 NullEnumerator 传递一个实例。
这里是一个 EmptyEnumerator 的示例
You can make a NullEnumerator which implements the IEnumerator interface. You can just pass an instance off the NullEnumerator.
here is an example of an EmptyEnumerator
发现这个问题正在寻找获取空枚举器的最简单方法。在看到比较性能的答案后,我决定使用空枚举器类解决方案,但我的解决方案比其他示例更紧凑,并且是通用类型,并且还提供了默认实例,因此您不必在所有情况下创建新实例时间,这应该会进一步提高性能。
Found this question looking for the simplest way to get an empty enumerator. After seeing the answer comparing performance I decided to use the empty enumerator class solution, but mine is more compact than the other examples, and is a generic type, and also provides a default instance so you don't have to create new instances all the time, which should even further improve performance.