Несмотря на то, что использование цикла 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