2013-11-15 5 views
4

Я заметил, что Iterator (интерфейс) Java похож на С # IEnumerable, но есть ли способ, чтобы использовать его как это:Java итератора в C# var.iterator

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

В Java я мог бы просто сделать :

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

Какой у C# эквивалент интерфейса Java Iterator?

ответ

7

Это не очень часто, но аналогия 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 «S 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(); 
Смежные вопросы