Usings.RU

Недокументированная особенность класса List<T>

Несмотря на то, что использование цикла foreach в принципе не комильфо, многие его используют. Для поклонников этого цикла и предлается следующая информация.
Не секрет, что, если в теле цикла foreach Вы попытаетесь изменить коллекцию List<T>, Вы получите InvalidOperationException. Однако это происходит не всегда.

В результате подробного изучения кода платформы, стало ясно, что у данного правила есть единственное исключение: метод Sort(Comparison<T> comparison).
Это баг Microsoft’а, и они о нем знают с моей подачи. Но, зная их, думаю, пару-тройку лет можно смело этой дыркой пользоваться.
Другое дело, что, в результате использования данного метода внутри цикла, состояние коллекции действительно становится неопределенным, так что используйте это знание на свой страх и риск.

Пример, вызывающий InvalidOperationException, как и положено:

C#:Select code
List<int> list = new List<int>(Enumerable.Range(1, 10));
int total = 0;
foreach (int i in list)
{
    total += i;
    list.Sort();
}
MessageBox.Show(total.ToString());

Пример использования дырки мелкософта:

C#:Select code
List<int> list = new List<int>(Enumerable.Range(1, 10));
int total = 0;
foreach (int i in list)
{
    total += i;
    list.Sort((a, b) => b.CompareTo(a));
}
MessageBox.Show(total.ToString());

Удачи!

Обсуждение на форуме: http://usings.ru/forum/viewtopic.php?t=12

Exit mobile version