Пусть у меня есть список экземпляров сотрудника, employeeListс помощью IEnumerator для перебора списка
IEnumerator enumerator = employeeList.GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current + " ");
}
У меня есть три вопроса:
У меня есть роды представление о том, как работает переписчик, как итератор в C++. Но я не понимаю метод MoveNex (например, itr ++ в C++), потому что он сначала проверяет условие (будь то в последнем элементе), скажем, если мы используем enumerator.Current для доступа к первому элементу, я думаю, что это на самом деле уже «переместился» на следующий элемент в списке, когда был вызван MoveNext(), поэтому объект, который Current points является фактически вторым элементом в списке?
Я думаю, что это будет иметь смысл, что мы можем получить доступ к текущему элементу при использовании enumerator.Current, например, мы должны быть в состоянии использовать
enumerator.Current.name
так же, как мы можем use (* itr) .name или itr => name в C++, но C# выглядит как не реализующий этот вид функции, тогда в чем смысл использовать enumerator.Current?
- Этот вопрос не связан с IEnumerator. Я только что видел некоторый код, как это:
IEnumerable<int> result = GetData() ?? Enumerable.Empty<int>;
Как новичок в C#, я знаю только &&
, ||
операторов, что "??
"?
3 является оператором с нулевым коалесцированием: https://msdn.microsoft.com/en-us/library/ms173224%28v=vs.100%29.aspx –
Почему вы не используете 'foreach'? Почему вы пытаетесь использовать базовую реализацию? –
Замечание, если вы получаете объект 'IEnumerator' вручную (а не через' foreach'), вам нужно его утилизировать, когда вы закончите перечисление, как правило, путем обертывания всего элемента в блок 'using' , 'using (IEnumerator enumerator = ...) {while (...) {}}' –