【问题标题】:What is the point of IEnumerator?IEnumerator 的意义何在?
【发布时间】:2012-11-14 03:58:37
【问题描述】:

This is an excellent video 解释它是什么以及不同之处,但它似乎有一个根本缺陷,你不能跳过列表;它甚至缺少 Previous() 方法。

如果找到匹配项后,我将列表发送到函数,而不是原来的 for...next 从下一个索引开始,我只是返回在函数中找到下一个匹配项的行,因为它已经完成了一个二级循环来读取每个“Hello”块之间的所有行。

我不能用像 IEnumerator 这样的迭代类来做这些;我错过了什么吗?

For row As Integer = 0 To dataList.Count - 1
    If row <> -1 Then
       If dataList.Item(row) = "Hello" Then row = SayHello(row)
    End If
Next

【问题讨论】:

  • dataList 是什么? ASP.NET 控件没有Item,但有一个Items 属性。很难理解这个问题。
  • @TimSchmelter:是什么让您认为这是在处理 ASP.NET? (无论如何,这不是相关的)
  • @AdamRobinson:我问过要理解这个理论问题背后的真正问题是什么类型。
  • @TimSchmelter:他问的是IEnumerator,而不是他问题中的具体代码。
  • @AdamRobinson:如果代码完全不相关,那就没必要了。带有 Count 属性和索引的东西对于 IEnumerator 来说不是一个很好的例子,因为它可能按照 for-loop 的建议实现了 IList

标签: .net for-loop ienumerator


【解决方案1】:

接口(以及随附的IEnumerable 接口)的目的是为迭代集合(或类似结构)提供只进机制。鉴于此,我认为说它有“根本缺陷”并不公平,因为你不能跳过或倒车,就像说紧凑型汽车有根本缺陷是公平的,因为你可以'不要用它来运输大型农场动物。

或者,对于那些可能不喜欢汽车类比的人来说,这类似于说香蕉有一个根本缺陷,因为它(在普通的、未冷冻的状态下)不能用来敲钉子。

【讨论】:

  • 你不得不用汽车来比喻,嗯 ;)
【解决方案2】:

IEnumerator 的要点是一次只服务一个对象,这意味着您可以节省内存和/或时间。要使用列表,您需要先填写列表。即使您并不真正需要完整列表,但在每次迭代时始终使用单个项目。

Private Iterator Function AllIntegers() As IEnumerable(Of Integer)
    Dim i = Integer.MinValue
    While i < Integer.MaxValue
        Yield i
    End While
End Function

现在你可以做

For each i in AllIntegers

现在尝试将所有这些整数放入 List(Of Integer)

【讨论】:

    【解决方案3】:

    枚举的定义就是一一提及。枚举是从顶部开始并查看列表中的每个项目。这就是枚举。因此,可枚举的东西将是您可以从顶部一一查看的东西。 IEnumerable 这个名字非常合适。

    【讨论】:

      【解决方案4】:

      你不能跳过列表

      你说这是一个缺陷。这不是您不想允许跳过列表的时候。

      人们对列表做的第一件事就是迭代它们——这是所有类型集合的最小公分母。

      如果您确实需要跳过,如您的示例所示,请不要使用IEnumerator

      【讨论】:

      • 我知道 IEnumerator 只是一个记住状态的豪华循环计数器,但没有 Previous() 方法等,那么它是一种徒劳的方法,可以用 for...next 或 for 复制。 ..每个。 *警告:我是一名休闲编码员,所以扮演魔鬼的拥护者;)
      • @Data:IEnumeratorforeach的主要实现方式。有些类型不提供对所包含元素的随机访问,例如DictionaryHashSet。但是,这些仍然可以枚举。
      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2017-05-06
      • 2020-11-10
      • 2023-03-29
      相关资源
      最近更新 更多