【问题标题】:Can I easily access the next iteration without using `foreach' in c#?我可以在不使用 c# 中的“foreach”的情况下轻松访问下一次迭代吗?
【发布时间】:2013-03-29 13:16:13
【问题描述】:

我有一个 C# 集合,我想知道是否可以像使用 Python 的 .next() 方法一样访问下一个产生的值。例如

 double diffFoo = myList.next() - myObject.Foo;
 double diffBar = myList.next() - myObject.Bar;
 ...

而不是,

 double diffFoo = myList[0] - myObject.Foo;
 double diffBar = myList[1] - myObject.Bar;
 ...

在这种情况下,foreach 循环是不合适的,因为每次“迭代”都使用不同的类方法。如果/当订单需要在代码中更改时,我想这样做以节省必须保持更新的索引。

【问题讨论】:

  • 是的,但您可能最终会使用 while loopGetEnumerator 方法,然后使用 .MoveNext() 方法您想举个例子吗?
  • 这个提议的解决方案解决的真正业务问题是什么?
  • @Pieter 用于定义一堆类来读取具有相似列但排序不同的不同 .csv 文件。使用迭代器方法,我可以剪切并粘贴到一个新类中并交换/添加/删除行,直到它们匹配。如果没有迭代器,我还必须设置索引,这很耗时。

标签: c# iterator


【解决方案1】:

不要忽视技术含量低的解决方案:

int index = 0;
double diffFoo = myList[index++] - myObject.Foo;
double diffBar = myList[index++] - myObject.Bar;

【讨论】:

    【解决方案2】:

    您可以使用IEnumerator.MoveNext 方法。

    var enumerator = myList.GetEnumerator();
    
    enumerator.MoveNext();
    double diffFoo = enumerator.Current - myObject.Foo;
    
    enumerator.MoveNext();
    double diffBar =enumerator.Current - myObject.Bar;
    

    【讨论】:

      【解决方案3】:

      如果您愿意,可以使用列表中的枚举器:

      var s = new List<string>() { "A", "B", "C" };
      var enumerator = s.GetEnumerator();
      enumerator.MoveNext();
      Debug.WriteLine(enumerator.Current);
      enumerator.MoveNext();
      Debug.WriteLine(enumerator.Current);
      

      【讨论】:

      • 只是一个警告 - 除了我在从 string[] 获取枚举器时必须在其中放置一个 .Cast&lt;string&gt;() 之外,它还有效,这样结果就不是通用对象。 (我意识到这个问题暗示了一个通用列表,但在我的实际代码中它是一个字符串数组)。
      【解决方案4】:

      IEnumerator 接口提供了一个名为 GetNext() 的方法。您可以从集合中获取下一个项目。还有IEnumerator的Generic版本:IEnumerator,见here

      参考here

      【讨论】:

        【解决方案5】:

        您应该阅读有关IEnumerableIEnumerable&lt;T&gt;IEnumerator 接口的信息。它们被foreach 循环使用。

        您可以在集合上调用GetEnumerator 来获取枚举器实例。这样你就可以使用MoveNext() 方法和Current 属性。

        【讨论】:

          【解决方案6】:

          这样的东西可以工作

          var someEnumerator = getInt().GetEnumerator();
          while(someEnumerator.MoveNext())
          {
              int intEnumerate = someEnumerator.Current;
              Console.WriteLine(intEnumerate);
          }
          

          【讨论】:

            【解决方案7】:

            我不知道 Python 但它现在存在于 c# 中!

            任何实现 IEnumerable 的对象都支持此功能。

            看看yield算子http://msdn.microsoft.com/en-us/library/9k7k7cf0(v=vs.80).aspx

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-17
              • 1970-01-01
              • 2021-01-10
              • 1970-01-01
              • 1970-01-01
              • 2011-07-05
              • 2011-01-14
              • 1970-01-01
              相关资源
              最近更新 更多