Индекс в Foreach - PullRequest
       14

Индекс в Foreach

3 голосов
/ 24 февраля 2010

В настоящее время я использую foreach, и мне нужен индекс элемента.

           foreach (DataRow m_row in base_rows)
       {
           Company nu = new Company(m_row, symb_rows[0]);
       }

Вот код.

Я пытаюсь получить индекс m_row внутри base_rows и использовать его для передачи symb_rows[index_of_m_row]. Это возможно, или я должен просто использовать нормальный цикл for?

Ответы [ 7 ]

11 голосов
/ 24 февраля 2010

Решение для цикла «for» совершенно ясно. В качестве интересного альтернативного решения вы можете полностью отказаться от цикла:

var companies = baseRows
  .Select((row, index) => new Company(row, symbRows[index]))
  .ToList();
7 голосов
/ 24 февраля 2010

Чтобы узнать ваш текущий индекс в коллекции (используя foreach), вы должны сделать это:

Int32 i = 0;
foreach (DataRow m_row in base_rows)
{
    Company nu = new Company(m_row, symb_rows[i]);
    i++;
}

или используйте стандартную петлю for. Интерфейс IEnumerable не предоставляет свойства позиционного индекса, поскольку он является итератором только для пересылки базовой последовательности элементов.

1 голос
/ 24 февраля 2010

Абсолютно лучший способ решить эту проблему - использовать цикл for () {}. Но вы можете получить фанк и написать метод расширения:)

public static void ForEachWithIndex<T>(this IEnumerable<T> items, Action<T, int> render)
{
    if (items == null)
        return;
    int i = 0;
    items.ForEach(item => render(item, i++));
}

И тоже используйте его

base_rows.ForEachWithIndex((m_row, index) => {
    Company nu = new Company(m_row, symb_rows[index]);
});

Но опять же, возможно, цикл for делает работу лучше;)

1 голос
/ 24 февраля 2010

Обычный цикл for - это путь, если вам нужен индекс.

1 голос
/ 24 февраля 2010

Вы должны использовать обычный цикл for или создать свой собственный счетчик, как предлагает Эндрю Хэйр, чтобы все заработало. Я бы предложил использовать цикл for.

0 голосов
/ 24 февраля 2010

Я бы, возможно, подумал об использовании метода IndexOf () следующим образом:

foreach(DataRow m_row in base_rows)
    Company nu = new Company(m_row, symb_rows.IndexOf(m_row));

Возможно, вам придется использовать Array.IndexOf () вместо этого, это работало в VBNET2008, так как я сейчас с ним работаю, но я не тестировал его в C #.

For Each DataRow m_row in base_rows
    Company nu = New Company(m_row, symb_rows(Array.IndexOf(symb_rows, m_row)))
Next

Так что я мог бы предложить следующее в C #.

foreach (DataRow m_row in base_rows)
    Company nu = new Company(m_row, symb_rows[Array.IndexOf(symb_rows, m_row)]);

В противном случае, вы можете вместо этого использовать for (;;), иногда лучше сделать это.

for(int index = 0; index < base_rows.Length && index < symb_rows.Length; ++index)
    Company nu = new Company(base_rows[index], symb_rows[symb_rows.IndexOf(base[index])]);

Хотя я не знаю, что вы предпочитаете.

0 голосов
/ 24 февраля 2010

Я бы просто использовал обычный цикл.

Вы можете иметь int приращения каждый раз, когда делаете цикл, но нормальным for( int i = 0.... будет ваша лучшая ставка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...