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

inf*_*rno 75 c# ienumerable iterator

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

Moa*_*Plz 140

是.请执行下列操作:

Collection<string> myCollection = new Collection<string>;

foreach (string curString in myCollection.Skip(3))
    //Dostuff
Run Code Online (Sandbox Code Playgroud)

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

foreach (string curString in myCollection.Take(3))
Run Code Online (Sandbox Code Playgroud)

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

foreach (string curString in myCollection.Skip(3).Take(3))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,C#区分大小写,因此这些都不会如图所示... (3认同)

Jon*_*eet 20

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

foreach (var value in sequence.Skip(1)) // Skips just one value
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

显然只是为任何其他值更改1以跳过不同数量的元素...

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

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


Ree*_*sey 5

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

例如:

foreach(item in theTree.Skip(9))  // Skips the first 9 items
{
    // Do something
Run Code Online (Sandbox Code Playgroud)

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