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

StackOverflow https://stackoverflow.com/questions/7310454

  •  26-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top