Используя IEnumerable без цикла foreach

Я имею, должен пропускать что-то простое здесь.

Возьмите следующий код:

public IEnumerable<int> getInt(){
  for(int i = 0; i < 10; i++){
   yield return i;
  }
}

Я могу назвать это с:

foreach (int j in obj.getInt()){
  //do something with j
}

Как может я использовать getInt метод без цикла foreach:

IEnumerable<int> iter = obj.getInt();
// do something with iter ??

Спасибо.

РЕДАКТИРОВАНИЯ

Для тех, которые задаются вопросом, почему я хотел бы это. Я выполняю итерации двух вещей:

IEnumerator<int> iter = obj.getInt().GetEnumerator();
foreach(object x in xs){
  if (x.someCondition) continue;
  iter.MoveNext();
  int n = iter.current();
  x.someProp = n;
  etc...
}
35
задан Mark 12 February 2010 в 02:43
поделиться

3 ответа

Вы можете получить ссылку на Enumerator , используя метод GetEnumerator , затем вы можете использовать метод MoveNext () , чтобы двигаться дальше, и использовать свойство Current для доступа к вашим элементам:

var enumerator = getInt().GetEnumerator();
while(enumerator.MoveNext())
{
    int n = enumerator.Current;
    Console.WriteLine(n);
}
60
ответ дан 27 November 2019 в 06:37
поделиться

Мой совет: ни в коем случае не возитесь со счетчиками. Охарактеризуйте вашу проблему как серию операций над последовательностями. Напишите код для выражения этих операций. Пусть операторы последовательности позаботятся об управлении счетчиками.

Итак, давайте посмотрим, правильно ли я понял. У вас есть две последовательности. Скажем, {2, 3, 5, 7, 12} и {"лягушка", "жаба"}. Логическая операция, которую вы хотите выполнить, - это, скажем, «пройти первую последовательность. Каждый раз, когда вы найдете число, делящееся на три, получите следующий элемент во второй последовательности. Сделайте что-нибудь с полученной парой (число, амфибия)».

Легко сделать. Сначала отфильтруйте первую последовательность:

var filtered = firstSequence.Where(x=>x%3 == 0);

Затем заархивируйте отфильтрованную последовательность со второй последовательностью:

var zipped = filtered.Zip(
             secondSequence, 
             (y, z)=> new {Number = x, Amphibian = y});

И теперь вы можете перебирать заархивированную последовательность и делать с парами все, что захотите:

foreach(var pair in zipped)
    Console.WriteLine("{0} : {1}", pair.Number, pair.Amphibian);

Легко, без путаницы насчет счетчиков.

31
ответ дан 27 November 2019 в 06:37
поделиться

Как насчет этого?

IEnumerator<int> iter = obj.getInt();
using(iter) {
    while(iter.MoveNext()) {
        DoSomethingWith(iter.Current)
    }
}
4
ответ дан 27 November 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: