Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IEnumerator遍历列表_C#_.net - Fatal编程技术网

C# 使用IEnumerator遍历列表

C# 使用IEnumerator遍历列表,c#,.net,C#,.net,假设我有一个employee实例列表,employeeList IEnumerator enumerator = employeeList.GetEnumerator(); while (enumerator.MoveNext()) { Console.Write(enumerator.Current + " "); } 我有三个问题: 我有一个关于枚举器如何工作的一般概念,就像C++中的迭

假设我有一个employee实例列表,employeeList

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看起来好像没有实现这类函数,那么使用枚举器有什么意义?

  • 这个问题与IEnumerator无关。我刚才看到一些代码如下:
  • 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); 
    }