7

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

private IEnumerable<Label> it; 
it = labels.iterator();

在Java中,我可以这样做:

private Iterator<JLabel> it;
it = labels.iterator();

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

4

2 回答 2

12

用的不是很频繁,但类比就是IEnumerator<T>接口:

var enumerator = labels.GetEnumerator();

.NETIEnumerator与 Java 的不同之处在于Iterator

  • Iterator构造后指向集合的第一个元素(或者,对于空集合,无效并将立即hasNext返回false),IEnumerator最初指向集合的第一个元素之前MoveNext(对于空集合将返回false
  • IteratorhasNext方法,同时为IEnumerator你验证MoveNext方法的结果
  • Iteratornext方法,而IEnumerator你也可以使用MoveNext
  • Iteratornext返回下一个元素,而在调用后IEnumerator使用Current属性MoveNext
  • Iterator在 Java 中具有remove允许您从基础集合中删除元素的方法。没有等价物IEnumerator

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

it = labels.iterator();
while (it.hasNext())
{
    elem = it.next();
}

在 C# 中:

en = labels.GetEnumerator();
while (en.MoveNext())
{
    elem = en.Current;
}

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

foreach (var label in labels)
{
    //...
}

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

IEnumerable<Label> it = labels;

当心,这IEnumerable<T>是懒惰的,就像Iterator在 Java 中一样。

您还可以像这样轻松获取集合的快照(再次it参考您的示例,可以选择更好的名称):

IEnumerable<Label> it = labels.ToArray();
// or Label[] it = labels.ToArray();
// or better: var it = labels.ToArray();
于 2013-11-15T00:23:35.817 回答
0

Java 的迭代器和 .Net 的 IEnumerable 之间还有另一个区别。前者有previous()后者所缺乏的方法。

于 2019-11-05T12:52:55.910 回答