我注意到Java的Iterator
(接口)类似于C#的IEnumerable
,但有没有办法像这样使用它:
private IEnumerable<Label> it;
it = labels.iterator();
在Java中,我可以做到:
private Iterator<JLabel> it;
it = labels.iterator();
什么是Java的Iterator
接口的C#等价物?
答案 0 :(得分:10)
它不经常使用,但类比是IEnumerator<T>
接口:
var enumerator = labels.GetEnumerator();
.NET的IEnumerator
与Java Iterator
的区别在于:
Iterator
构造后指向集合的第一个元素(或者,对于空集合,它是无效的,hasNext
将立即返回false
),IEnumerator
最初之前集合的第一个元素(对于空集合MoveNext
将返回false
)Iterator
使用hasNext
方法,而IEnumerator
则验证MoveNext
方法的结果Iterator
使用next
方法,而对于IEnumerator
,您还使用MoveNext
Iterator
的{{1}}会返回下一个元素,而next
则会在调用IEnumerator
后使用Current
属性MoveNext
具有Iterator
方法,允许您从基础集合中删除元素。 remove
因此,对于Java,您将使用以下内容进行迭代:
IEnumerator
在C#中:
it = labels.iterator();
while (it.hasNext())
{
elem = it.next();
}
通常,将en = labels.GetEnumerator();
while (en.MoveNext())
{
elem = en.Current;
}
作为集合(总是实现IEnumerable<T>
),您只需直接使用它:
labels
当然,您可以存储foreach (var label in labels)
{
//...
}
供以后使用(参考您的示例的名称):
IEnumerable<T>
注意,IEnumerable<Label> it = labels;
是懒惰的,就像Java中的IEnumerable<T>
一样。
您还可以轻松获取此类集合的快照(同样,Iterator
引用您的示例,可以选择更好的名称):
it
答案 1 :(得分:0)
Java的迭代器与.Net的IEnumerable之间还有另一个区别。前者具有previous()
方法,后者缺乏。