我正在考虑为我的自定义集合(一棵树)实现IEnumerable,以便可以使用foreach遍历我的树。但是据我所知,foreach总是从集合的第一个元素开始。我想从foreach从哪个元素开始。是否有可能以某种方式更改foreach的起始元素?
我正在考虑为我的自定义集合(一棵树)实现IEnumerable,以便可以使用foreach遍历我的树。但是据我所知,foreach总是从集合的第一个元素开始。我想从foreach从哪个元素开始。是否有可能以某种方式更改foreach的起始元素?
Answers:
是。请执行下列操作:
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))
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
vs for(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
Skip
为此,最容易使用LINQ to Objects中的方法来跳过给定数量的元素:
foreach (var value in sequence.Skip(1)) // Skips just one value
{
...
}
显然,只需将其他任何值更改为1即可跳过不同数量的元素...
同样,您可以Take
用来限制返回的元素数。
您可以在我的Edulinq博客系列中阅读有关这两种方法(以及相关SkipWhile
和TakeWhile
方法)的更多信息。
sequence
可以合法存在null
。大概OP可以自己处理-这实际上不是问题的一部分...
您可以使用Enumerable.Skip跳过一些元素,然后从那里开始。
例如:
foreach(item in theTree.Skip(9)) // Skips the first 9 items
{
// Do something
但是,如果您正在编写树,则可能需要在树项本身上提供一个成员,该成员将返回一个新成员,该成员IEnumerable<T>
将从此处开始枚举。从长远来看,这可能会更加有用。
IEnumerable<T> SubTree(rootIndex)
什么?好决定!
IEnumerable<MyTreeElement> Children
,因此您可以这样做: foreach(var item in someElement.Children)
-比使用IMO扩展方法要清晰得多。
如果要跳过阅读中的行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行。
DataGridView
(甚至没有UI框架)。