Я подумываю о внедрении IEnumerable для моей собственной коллекции (дерева), поэтому я могу использовать foreach для перемещения моего дерева. Однако, насколько я знаю, foreach всегда начинается с первого элемента коллекции. Я хотел бы выбрать, из какого элемента foreach запускается. Возможно ли каким-либо образом изменить элемент, из которого запускается foreach?
Можно ли начинать итерацию с другого элемента, кроме первого, используя foreach?
Ответ 1
Да. Выполните следующие действия:
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))
Ответ 2
Проще всего использовать Skip
метод в LINQ для объектов для этого, чтобы пропустить определенное количество элементов:
foreach (var value in sequence.Skip(1)) // Skips just one value
{
...
}
Очевидно, просто измените 1 для любого другого значения, чтобы пропустить другое количество элементов...
Аналогично вы можете использовать Take
, чтобы ограничить количество возвращаемых элементов.
Вы можете узнать больше об обоих из них (и связанных методах SkipWhile
и TakeWhile
) в моей блоге блога Edulinq.
Ответ 3
Вы можете использовать Enumerable.Skip, чтобы пропустить некоторые элементы и начать работу там.
Например:
foreach(item in theTree.Skip(9)) // Skips the first 9 items
{
// Do something
Однако, если вы пишете дерево, вам может потребоваться предоставить член на самом элементе дерева, который вернет новый IEnumerable<T>
, который будет перечисляться оттуда. Это, возможно, будет более полезным в долгосрочной перспективе.
Ответ 4
Foreach
будет перебирать вашу коллекцию способом, определенным вашей реализацией IEnumerable
. Итак, хотя вы можете пропустить элементы (как было предложено выше), вы по-прежнему технически повторяете элементы в том же порядке.
Не уверен, чего вы пытаетесь достичь, но ваш класс может иметь несколько свойств IEnumerable
, каждый из которых перечисляет элементы в определенном порядке.