我正在考虑为我的自定义集合(树)实现IEnumerable,所以我可以使用foreach来遍历我的树。但据我所知,foreach总是从集合的第一个元素开始。我想选择foreach从哪个元素开始。是否有可能以某种方式改变foreach开始的元素?
答案 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中详细了解这两种方法(以及相关的SkipWhile
和TakeWhile
方法)。
答案 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行。