Простое использование 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