Подтвердить что ты не робот

Можно ли начинать итерацию с другого элемента, кроме первого, используя foreach?

Я подумываю о внедрении IEnumerable для моей собственной коллекции (дерева), поэтому я могу использовать foreach для перемещения моего дерева. Однако, насколько я знаю, foreach всегда начинается с первого элемента коллекции. Я хотел бы выбрать, из какого элемента foreach запускается. Возможно ли каким-либо образом изменить элемент, из которого запускается foreach?

4b9b3361

Ответ 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, каждый из которых перечисляет элементы в определенном порядке.