Можно ли начать итерацию с элемента, отличного от первого, используя foreach? - PullRequest
73 голосов
/ 21 июня 2011

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

Ответы [ 5 ]

135 голосов
/ 21 июня 2011

Да.Выполните следующие действия:

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))
19 голосов
/ 21 июня 2011

Для этого проще всего использовать метод Skip в LINQ to Objects, чтобы пропустить указанное количество элементов:

foreach (var value in sequence.Skip(1)) // Skips just one value
{
    ...
}

Очевидно, просто измените 1 для любого другого значениячтобы пропустить различное количество элементов ...

Аналогичным образом вы можете использовать Take для ограничения количества возвращаемых элементов.

Подробнее ооба из них (и связанные SkipWhile и TakeWhile методы) в моей серии блогов Edulinq .

5 голосов
/ 21 июня 2011

Вы можете использовать Enumerable.Skip , чтобы пропустить некоторые элементы и запустить его там.

Например:

foreach(item in theTree.Skip(9))  // Skips the first 9 items
{
    // Do something

Однако, если выПри написании дерева, вы можете захотеть предоставить элемент самого элемента дерева, который будет возвращать новый IEnumerable<T>, который будет перечислять оттуда вниз.Это потенциально может быть более полезным в долгосрочной перспективе.

0 голосов
/ 17 апреля 2018

Если вы хотите пропустить чтение строк в 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 строки.

0 голосов
/ 21 июня 2011

Foreach будет перебирать вашу коллекцию так, как определено вашей реализацией IEnumerable.Итак, хотя вы можете пропустить элементы (как предложено выше), вы все равно технически перебираете элементы в том же порядке.

Не уверен, чего вы пытаетесь достичь, но ваш класс может иметь несколько IEnumerable свойства, каждое из которых перечисляет элементы в определенном порядке.

...