我可以轻松访问下一次迭代而不使用`foreach'在c#?

时间:2013-03-29 13:16:13

标签: c# iterator

我有一个C#Collection,我想知道是否有可能访问下一个产生的值,类似于使用Python的.next()方法。 e.g。

 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循环不合适,因为在每个'迭代'上使用了不同的类方法。我想这样做是为了在代码需要在代码中更改时保存更新索引。

7 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您可以使用IEnumerator.MoveNext方法。

var enumerator = myList.GetEnumerator();

enumerator.MoveNext();
double diffFoo = enumerator.Current - myObject.Foo;

enumerator.MoveNext();
double diffBar =enumerator.Current - myObject.Bar;

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

请参阅here以供参考。

答案 4 :(得分:0)

您应该阅读有关IEnumerableIEnumerable<T>IEnumerator接口的信息。它们由foreach循环使用。

您可以在集合上调用GetEnumerator来获取枚举器实例。有了它,您可以使用MoveNext()方法和Current属性。

答案 5 :(得分:0)

这样的事情可以起作用

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

答案 6 :(得分:0)

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

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

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