Простое использование IEnumerator (с примером)
У меня возникли проблемы с запоминанием того, как (но не почему) использовать IEnumerator
в С#. Я привык к Java с замечательной документацией, которая очень хорошо объясняет начинающим. Поэтому, пожалуйста, несите меня.
Я пробовал учиться другим ответам на этих досках безрезультатно. Вместо того, чтобы задавать общий вопрос, который уже был задан раньше, у меня есть конкретный пример, который прояснит мне все.
Предположим, что у меня есть метод, которому необходимо передать объект IEnumerable<String>
. Весь метод, который нужно выполнить, - это конкатенация букв roxxors
до конца каждого String
в итераторе. Затем он вернет этот новый итератор (конечно, исходный объект IEnumerable
остается таким, каким он был).
Как я могу это сделать? Ответ здесь должен помочь многим с основными вопросами об этих объектах, кроме меня, конечно.
Ответы
Ответ 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");
Подробнее здесь Перечислить.выбрать метод