我可以很容易地访问下一个迭代而不使用' foreach'在c#

本文关键字:foreach 很容易 访问 下一个 迭代 我可以 | 更新日期: 2023-09-27 18:06:33

我有一个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循环是不合适的,因为在每次"迭代"上使用不同的类方法。如果/当顺序需要在代码中更改时,我想这样做是为了节省必须保持更新索引的时间。

我可以很容易地访问下一个迭代而不使用' foreach'在c#

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

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

可以使用IEnumerator。MoveNext方法。

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

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

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

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

您应该阅读IEnumerable, IEnumerable<T> IEnumerator 接口。它们被foreach循环使用。

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

可以这样做

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

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

任何实现IEnumerable的对象都支持这个特性。

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