Простое использование ienumerator (с примером)
-
26-10-2019 - |
Вопрос
Мне трудно вспомнить, как (но не почему) использовать IEnumerator
S в 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");
Прочитайте больше здесь Перечисление. Метод выбора