Простое использование IEnumerator (с примером)
у меня возникли проблемы с запоминанием, как (но не почему) использовать IEnumerator
s в C#. Я привык к Java с его замечательной документацией, которая объясняет все новичкам довольно хорошо. Так что, пожалуйста, потерпите меня.
Я пробовал учиться у других ответов на этих досках безрезультатно. Вместо того, чтобы задавать общий вопрос, который уже задавался раньше, у меня есть конкретный пример, который прояснит для меня ситуацию.
Предположим, у меня есть метод, который должен быть передан Ан
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");
подробнее здесь перечисли.Выберите Метод