【问题标题】:Does the IEnumerator of .Net IList provide the order of the list?.Net IList 的 IEnumerator 是否提供列表的顺序?
【发布时间】:2009-09-23 13:35:53
【问题描述】:

我可以假设我从IList 获得的IEnumerator(通过从IEnumerable 接口调用GetEnumerator 方法)将按列表顺序为我提供项目?

【问题讨论】:

    标签: c# list ienumerable ienumerator


    【解决方案1】:

    你不能,因为 IList 是一个接口,而实现可以以任何顺序枚举项目。例如,我可以实现 WeirdList : IList,并让它以任何方式枚举项目,包括非确定性的。另一方面,如果您使用 List(T),它保证按照它们在列表中存储的顺序枚举项目。

    编辑:话虽如此,正如许多其他人指出的那样,大多数实现将遵循 List(T) 的语义。虽然那不是你问的;)

    【讨论】:

    • +1 大多数实现都是相似的,但根据这一事实编写代码将是一个巨大的错误。
    • 我会警告不要尝试验证具有相当硬和快速语义的数据结构的语义的代码。这对您的单元测试来说是可以的,以确保 MyListImpl 与 IList 所暗示的匹配,但实际的生产代码不应该有这些检查。
    【解决方案2】:

    枚举器应该允许您访问列表中相对于它们在内存中的位置的对象,这与在 for 循环中使用从 0 到 Length

    编辑:我特别回答了实现 IList 的 .NET 框架类,如果任何其他人实现这些接口,他们的实际实现几乎可以是任何东西。所以这取决于实施者。

    【讨论】:

      【解决方案3】:

      是的,至少对于IList 的任何体面实现,它都会做到这一点。一个好的IList 应该始终按照列表的索引顺序枚举其元素。

      List<int> list = new List<int> { 1, 1, 2, 3, 5, 8 };
      
      IEnumerator<int> enumtor = list.GetEnumerator();
      while (enumtor.MoveNext())
      {
          Console.Write(enumtor.Current);
      }
      

      打印112358

      【讨论】:

      • 现在有办法保证实现 IList 的人遵循这个原则,有一些例子表明不按顺序返回它是有意义的。
      • 无法保证,但这是一个普遍有效的假设,并且supposed是一个有效的假设。
      • 我同意这应该是一个有效的假设,但经验告诉我,程序员有时会在他们的代码中做一些疯狂的事情 :)
      • 是的。不过,从这个问题的小背景来看,我认为这只是 .NET 的新手,想知道通常的行为是什么,这就是我回答的方式。
      【解决方案4】:

      这将取决于 IList 的实现

      【讨论】:

        猜你喜欢
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2016-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        相关资源
        最近更新 更多