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

时间:2011-06-21 17:51:05

标签: c# iterator ienumerable

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

5 个答案:

答案 0 :(得分:132)

是。执行以下操作:

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))

答案 1 :(得分:18)

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

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

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

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

您可以在my Edulinq blog series中详细了解这两种方法(以及相关的SkipWhileTakeWhile方法)。

答案 2 :(得分:5)

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

例如:

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

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

答案 3 :(得分:-1)

Foreach将按照您IEnumerable的实施方式定义的方式迭代您的收藏。因此,虽然您可以跳过元素(如上所述),但您仍然在技术上以相同的顺序迭代元素。

不确定您要实现的目标,但您的类可能有多个IEnumerable属性,每个属性都按特定顺序枚举元素。

答案 4 :(得分:-1)

如果您想跳过DataGridView中的行,请尝试使用

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))

如果要将一个DataGridView的内容复制到另一个跳过行,请尝试使用

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow>().Skip(3))
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        string value = cell.Value.ToString();
        dataGridView2.Rows[i].Cells[j].Value = cell.Value.ToString();
        j++;
    }
    i++;
    j = 0;
}

将内容从一个DataGridView复制到另一个跳过3行。