Как проверить, существует ли значение в списке (до выхода за пределы диапазона) - PullRequest
3 голосов
/ 18 января 2012

У меня есть этот список:

IList<Modulo> moduli = (from Modulo module in Moduli
                       select module).ToList();

, и я запускаю его циклом с (замечание i = i + 2):

for(int i=0; i<moduli.Count; i=i+2)
{
}

сейчас, я должен проверить, есть ли модули [я + 1] существует (так, следующий элемент), иначе я получу System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection..

Как я могу это проверить?Пробовал с:

if(moduli[i+1] != null) 
{
}

но это не работает!

Ответы [ 5 ]

7 голосов
/ 18 января 2012

Проверьте это так же, как вы проверяете состояние петли:

if(i + 1 < moduli.Count) // it exists

Обратите внимание на < вместо <=, что является ошибкой в ​​вашем исходном коде.

5 голосов
/ 18 января 2012

Как насчет:

if (i + 1 < moduli.Count)
{
  var modulo = moduli[i+1]; // this is safe
}

это не должно быть правдой, если ваш i + 1 вызовет ArgumentOutOfRangeException

Кстати, причина, по которой это не работает:

if(moduli[i+1] != null) 

означает, что ArgumentOutOfRangeException будет выдано, как только вы выполните проверку.

1 голос
/ 18 января 2012

Как насчет

for(int i=0; i <= (moduli.Count - (moduli.Count % 2)); i=i+2)
{
} 
0 голосов
/ 18 января 2012

Очень просто:

for(int i=0; i<moduli.Count - 2; i=i+2) { }
0 голосов
/ 18 января 2012

Linq может сделать работу за вас:)

IList<Modulo> moduli = Moduli.Where((item, index) => ((index % 2) == 0)).
                              ToList();
...