我注意到 Java 的Iterator
(接口)类似于 C# 的IEnumerable
,但是有没有办法像这样使用它:
private IEnumerable<Label> it;
it = labels.iterator();
在Java中,我可以这样做:
private Iterator<JLabel> it;
it = labels.iterator();
JavaIterator
接口的 C# 等价物是什么?
用的不是很频繁,但类比就是IEnumerator<T>
接口:
var enumerator = labels.GetEnumerator();
.NETIEnumerator
与 Java 的不同之处在于Iterator
:
Iterator
构造后指向集合的第一个元素(或者,对于空集合,无效并将立即hasNext
返回false
),IEnumerator
最初指向集合的第一个元素之前MoveNext
(对于空集合将返回false
)Iterator
有hasNext
方法,同时为IEnumerator
你验证MoveNext
方法的结果Iterator
有next
方法,而IEnumerator
你也可以使用MoveNext
Iterator
的next
返回下一个元素,而在调用后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();
Java 的迭代器和 .Net 的 IEnumerable 之间还有另一个区别。前者有previous()
后者所缺乏的方法。