Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вот документация по 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();
}

Ответ 2

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 и (**) - это просто синтаксический сахар для (*).

Ответ 3

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

например.

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Подробнее здесь Перечислить.выбрать метод