Java Iterator与C#IEnumerable

时间:2013-11-15 00:21:32

标签: c# java iterator

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

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

在Java中,我可以做到:

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

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

2 个答案:

答案 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属性
  • Java中的
  • 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()方法,后者缺乏。