C# 使用IEnumerator遍历列表
假设我有一个employee实例列表,employeeListC# 使用IEnumerator遍历列表,c#,.net,C#,.net,假设我有一个employee实例列表,employeeList IEnumerator enumerator = employeeList.GetEnumerator(); while (enumerator.MoveNext()) { Console.Write(enumerator.Current + " "); } 我有三个问题: 我有一个关于枚举器如何工作的一般概念,就像C++中的迭
IEnumerator enumerator = employeeList.GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current + " ");
}
我有三个问题:
<>我有一个关于枚举器如何工作的一般概念,就像C++中的迭代器。
但是我不理解MoveNex方法(就像C++中的itr++一样),因为它首先检查条件(是否在最后一个元素中),比方说如果我们使用enumerator.Current访问第一个元素,我认为它实际上已经“移动”到列表中的下一个元素,因为调用了MoveNext(),那么当前点所在的对象实际上是列表中的第二个元素
enumerator.Current.name
就像我们可以在C++中使用(*ITR).Name或ITR= >名称,但C看起来好像没有实现这类函数,那么使用枚举器有什么意义?
IEnumerable结果=GetData()??可枚举。空代码>
作为C#的初学者,我只知道&&
,|
运算符,什么是“?
”?使用IEnumerable
:
foreach (var e in employeeList)
{
Console.Write(e + " ");
}
最初,枚举数位于第一个元素之前(因为枚举可能为空)。因此,MoveNext
的第一次调用将其移动到第一个元素(如果可枚举项为空,则返回false)
您使用的是旧的非通用版本的IEnumerator
,其中Current
返回一个对象。您可以将对象强制转换为具体类型并调用.name
,或者更好地使用employeeList
的类型,该类型返回强类型的IEnumerator
(例如List
)
这是最新的
PS:以后,请为每个问题创建一个SO问题。1+2可以看作是相关的,但3绝对不是
PPS:如果您只需要一个以空格分隔的员工姓名列表,则根本不需要显式循环:
var names = String.Join(" ", employeeList.Select(e => e.name));
阅读:“创建枚举数后,枚举数定位在集合中第一个元素之前,对MoveNext
的第一次调用将枚举数前进到集合的第一个元素”
代码的问题是将枚举数分配给非泛型枚举数变量。这是因为泛型IEnumerator
接口继承自非泛型接口。但这也是为什么不能使用Employee
-类的属性的原因,因为类型是Object
。您必须首先将枚举数.Current
强制转换为正确的类型
因此,最好使用通用版本(并使用正确地使用它):
如果您只需要枚举整个集合,那么使用foreach
更为方便:
foreach(Employee emp in employeeList)
{
Console.WriteLine(emp.Name);
}
公开枚举数,该枚举数支持对非泛型集合进行简单迭代
foreach (var employee in employeeList)
{
// do your stuff here, you have full employee object
Console.WriteLine(employee.FirstName);
}
??
运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则它将返回右侧操作数。3是空合并运算符:为什么不使用foreach
?为什么要尝试使用底层实现?请注意,如果要手动获取IEnumerator
对象(而不是通过foreach
),则需要在完成枚举时处理它,通常是通过使用块将整个对象包装在中<代码>使用(IEnumerator enumerator=…){while(…){}
-1,再次感谢不使用引号块指示从源代码复制的内容。
foreach(Employee emp in employeeList)
{
Console.WriteLine(emp.Name);
}
foreach (var employee in employeeList)
{
// do your stuff here, you have full employee object
Console.WriteLine(employee.FirstName);
}