Java Iterator与C#IEnumerable

Joã*_*lva 6 c# java iterator

我注意到Java的Iterator(接口)类似于C#IEnumerable,但有没有办法像这样使用它:

private IEnumerable<Label> it; 
it = labels.iterator();
Run Code Online (Sandbox Code Playgroud)

在Java中,我可以这样做:

private Iterator<JLabel> it;
it = labels.iterator();
Run Code Online (Sandbox Code Playgroud)

什么是Java的Iterator接口的C#等价物?

Bar*_*zKP 10

它不经常使用,但类比是IEnumerator<T>界面:

var enumerator = labels.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

.NET IEnumerator与Java 的不同之处Iterator如下:

  • Iterator构造后指向集合的第一个元素(或者,对于空集合,无效并将立即hasNext返回false),IEnumerator最初集合的第一个元素之前的点(对于空集合MoveNext将返回false)
  • IteratorhasNext方法,而IEnumerator你验证MoveNext方法的结果
  • Iteratornext方法,而IEnumerator你也使用MoveNext
  • Iteratornext返回的下一个元素,同时与IEnumerator您使用Current调用后财产MoveNext
  • IteratorJava中的remove方法允许您从基础集合中删除元素.没有相应的IEnumerator

因此,对于Java,您将使用以下内容进行迭代:

it = labels.iterator();
while (it.hasNext())
{
    elem = it.next();
}
Run Code Online (Sandbox Code Playgroud)

在C#中:

en = labels.GetEnumerator();
while (en.MoveNext())
{
    elem = en.Current;
}
Run Code Online (Sandbox Code Playgroud)

通常,labels作为集合(总是实现IEnumerable<T>),您只需直接使用它:

foreach (var label in labels)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以存储IEnumerable<T>以供以后使用(参考您的示例的名称):

IEnumerable<Label> it = labels;
Run Code Online (Sandbox Code Playgroud)

当心,这IEnumerable<T>很懒,就像Iterator在Java中一样.

您还可以轻松获取此类集合的快照(同样,请it参考您的示例,可以选择更好的名称):

IEnumerable<Label> it = labels.ToArray();
// or Label[] it = labels.ToArray();
// or better: var it = labels.ToArray();
Run Code Online (Sandbox Code Playgroud)