Я думаю о реализации IEnumerable для моей пользовательской коллекции (дерева), чтобы я мог использовать foreach для обхода моего дерева. Однако, насколько мне известно, foreach всегда начинается с первого элемента коллекции. Я хотел бы выбрать, с какого элемента запускается foreach. Можно ли как-то изменить элемент, с которого начинается foreach?
87
Ответы:
Да. Сделайте следующее:
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"; }
vsfor(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
для ограничения количества возвращаемых элементов.Вы можете прочитать больше об обоих из них (и связанный с ним
SkipWhile
иTakeWhile
методы) в моем блоге Edulinq серии .источник
sequence
законно это может бытьnull
или нет. Предположительно ОП может справиться с этим самостоятельно - на самом деле это не часть вопроса ...Вы можете использовать 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.Foreach
будет перебирать вашу коллекцию способом, определенным вашей реализациейIEnumerable
. Итак, хотя вы можете пропускать элементы (как было предложено выше), вы по-прежнему технически повторяете элементы в том же порядке.Не уверен, чего вы пытаетесь достичь, но ваш класс может иметь несколько
IEnumerable
свойств, каждое из которых перечисляет элементы в определенном порядке.источник
Если вы хотите пропустить чтение строк в
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
(или даже о структуре пользовательского интерфейса).