gpt4 book ai didi

c# - 使用 IEnumerator 遍历列表

转载 作者:可可西里 更新时间:2023-11-01 08:33:10 24 4
gpt4 key购买 nike

假设我有一个员工实例列表,employeeList .我可以像这样遍历它们:

IEnumerator enumerator = employeeList.GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current + " ");
}

我有三个问题:

  1. 我对枚举器的工作原理有一个大概的了解,就像 C++ 中的迭代器一样。但我不明白 MoveNext()方法(如 C++ 中的 itr ++),因为该方法首先检查条件(是否在最后一个元素中)。假设我们使用 enumerator.Current访问第一个元素:我认为它实际上已经“移动”到列表中的下一个元素,如 MoveNext()已被调用。所以不应该 Current 的对象指向实际上是列表中的第二个元素?

  2. 我认为在使用 enumerator.Current 时我们可以访问当前元素是有意义的.例如,我们应该可以使用 enumerator.Current.name ,就像我们可以使用 (*itr).nameitr=>name在 C++ 中。然而,C# 看起来并没有实现这种功能。那么使用 enumerator.Current 有什么意义呢? ?

  3. 这个问题与 IEnumerator 无关。我刚刚看到一些这样的代码:
    IEnumerable<int> result = GetData() ?? Enumerable.Empty<int>;
    作为C#的初学者,我只知道&&||运营商。什么是 ??

最佳答案

阅读documentation : “创建枚举器后,枚举器位于集合中的第一个元素之前,第一次调用 MoveNext 将枚​​举器推进到第一个元素 的集合"

您的代码存在的问题是您将枚举器分配给了非通用枚举器变量。之所以有效,是因为通用 IEnumerator<T>接口(interface)继承自非泛型。但这也是您不能使用 Employee 属性的原因。 -class 因为类型是 Object .你必须投 enumerator.Current首先到正确的类型。

因此最好使用通用版本(并使用 using 正确配置它):

using(IEnumerator<Employee> empEnumerator = employeeList.GetEnumerator())
{
while(empEnumerator.MoveNext())
{
// now empEnumerator.Current is the Employee instance without casting
Employee emp = empEnumerator.Current;
string empName = emp.Name; // ...
}
}

您还可以使用 var它的工作方式类似于 C# 中真实类型的占位符:

using(var empEnumerator = employeeList.GetEnumerator())
{ ... }

如果您只需要枚举整个集合 a foreach更舒服:

foreach(Employee emp in employeeList)
{
Console.WriteLine(emp.Name);
}

关于c# - 使用 IEnumerator 遍历列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41460167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com