是否有可能开始迭代从第一个使用foreach以外的元素?

我正在考虑为自定义集合(一棵树)实现IEnumerable,所以我可以使用foreach来遍历我的树。 但据我所知,foreach总是从集合的第一个元素开始。 我想selectforeach从哪个元素开始。 是否有可能以某种方式改变foreach开始的元素?

是。 请执行下列操作:

Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff 

Skip是一个IEnumerable函数,可以跳过你从当前索引开始指定的许多函数。 另一方面,如果你只想使用前三个,你会使用。 .Take

 foreach (string curString in myCollection.Take(3)) 

这些甚至可以配对在一起,所以如果你只想要4-6个项目你可以做:

 foreach (string curString in myCollection.Skip(3).Take(3)) 

在LINQ to Objects中使用Skip方法最简单,跳过给定数量的元素:

 foreach (var value in sequence.Skip(1)) // Skips just one value { ... } 

显然,只要更改1的任何其他值跳过不同数量的元素…

同样,您可以使用Take来限制返回的元素的数量。

您可以在我的Edulinq博客系列中阅读更多关于这两者(以及相关的SkipWhileTakeWhile方法)。

您可以使用Enumerable.Skip跳过一些元素,并从那里开始。

例如:

 foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something 

但是,如果您正在编写树,则可能需要在树项目本身上提供一个成员,该成员将返回一个新的IEnumerable<T> ,它将从那里枚举。 从长远来看,这可能会更有用。

Foreach将按照您的IEnumerable实现定义的方式迭代您的集合。 所以,尽pipe你可以跳过元素(如上面所build议的那样),但是你仍然在技术上以相同顺序迭代元素。

不知道你想实现什么,但是你的类可以有多个IEnumerable属性,每个属性都按特定的顺序枚举元素。