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

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

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

Предположим, у меня есть метод, который должен быть передан IEnumerable<String> объект. Все, что нужно сделать методу - это объединить буквы roxxors до конца каждого String в итераторе. Затем он вернет этот новый итератор (конечно, оригинал IEnumerable объект оставлен как был).

Как бы я пошел по этому поводу? Ответ здесь должен помочь многим с основными вопросами об этих объектах в дополнение ко мне, конечно.

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";
  }
}

используя конструкцию yield или просто

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

или же

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

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

Если я вас правильно понимаю, то в C# 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");

Подробнее здесь Enumerable.Select Method

Другие вопросы по тегам