Простое использование IEnumerator (с примером)


у меня возникли проблемы с запоминанием, как (но не почему) использовать IEnumerators в C#. Я привык к Java с его замечательной документацией, которая объясняет все новичкам довольно хорошо. Так что, пожалуйста, потерпите меня.

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

Предположим, у меня есть метод, который должен быть передан Ан

5 56

5 ответов:

вот документация на IEnumerator. Они используются для получения значений списков, где длина не обязательно известна заранее (даже если это может быть). Слово происходит от enumerate, что означает "отсчитывать или называть по одному".

IEnumerator и IEnumerator<T> предоставляется всем IEnumerable и IEnumerable<T> интерфейсы (последний предоставляет оба) в .NET через GetEnumerator(). Это важно, потому что foreach инструкция предназначена для работы непосредственно с перечислители через эти методы интерфейса.

например:

IEnumerator enumerator = enumerable.GetEnumerator();

while (enumerator.MoveNext())
{
    object item = enumerator.Current;
    // Perform logic on the item
}

будет:

foreach(object item in enumerable)
{
    // Perform logic on the item
}

что касается вашего конкретного сценария, почти все коллекции в .NET реализуют IEnumerable. Из-за этого вы можете сделать следующее:

public IEnumerator Enumerate(IEnumerable enumerable)
{
    // List implements IEnumerable, but could be any collection.
    List<string> list = new List<string>(); 

    foreach(string value in enumerable)
    {
        list.Add(value + "roxxors");
    }
    return list.GetEnumerator();
}
public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  List<string> myList = new List<string>();
  foreach(string str in strings)
  {
      myList.Add(str + "roxxors");
  }
  return myList;
}

или

public IEnumerable<string> Appender(IEnumerable<string> strings)
{
  foreach(string str in strings)
  {
      yield return str + "roxxors";
  }
}

С помощью доходность строительства, или просто

var newCollection = strings.Select(str => str + "roxxors"); //(*)

или

var newCollection = from str in strings select str + "roxxors"; //(**)

где два последних использовать LINQ и (**) - это просто синтаксический сахар для (*).

Если я правильно вас понимаю, то в c# the yield return компилятор магия все, что вам нужно, я думаю.

например

IEnumerable<string> myMethod(IEnumerable<string> sequence)
{
    foreach(string item in sequence)
    {
         yield return item + "roxxors";
    }
}

Я бы сделал что-то вроде:

private IEnumerable<string> DoWork(IEnumerable<string> data)
{
    List<string> newData = new List<string>();
    foreach(string item in data)
    {
        newData.Add(item + "roxxors");
    }
    return newData;
}

простые вещи :)

также вы можете использовать метод выбора LINQ:

var source = new[] { "Line 1", "Line 2" };

var result = source.Select(s => s + " roxxors");

подробнее здесь перечисли.Выберите Метод