我可以很容易地访问下一个迭代而不使用' 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
循环是不合适的,因为在每次"迭代"上使用不同的类方法。如果/当顺序需要在代码中更改时,我想这样做是为了节省必须保持更新索引的时间。
不要忽视低技术含量的解决方案:
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