Недавно я столкнулся со странной проблемой, когда у меня был метод, генерирующий IEnumerable
коллекцию объектов. Этот метод содержал четыре оператора yield return
, которые возвращали четыре объекта. Я присвоил результат переменной results
, используя ключевое слово var
.
var result = GenerateCollection().ToList();
Фактически это означало: List<MyType> result = GenerateCollection()
.
Я сделал простой цикл for для элементов этой коллекции. Что меня удивило, так это то, что коллекция перенумеровывалась для каждого обращения к списку (для каждого result[i]
). Позже я использовал коллекцию result
в запросе LINQ, который имел некоторые плохие результаты с точки зрения производительности из-за постоянного перенумерации коллекции.
Я решил проблему, приведя массив вместо списка.
Что заставляет меня задаться вопросом, когда перечисляются коллекции? Какие вызовы методов заставляют коллекции перенумеровываться?
РЕДАКТИРОВАТЬ: метод GenerateCollection()
выглядел примерно так:
public static IEnumerable<MyType> GenerateCollection()
{
var array = data.AsParallel(); //data is a simple collection of sublists of strings
yield return new MyType("a", array.Where(x => x.Sublist.Count(y => y == 'a') == 0));
yield return new MyType("b", array.Where(x => x.Sublist.Count(y => y == 'b') == 0));
yield return new MyType("c", array.Where(x => x.Sublist.Count(y => y == 'c') == 0));
yield return new MyType("d", array.Where(x => x.Sublist.Count(y => y == 'd') == 0));
}
MyType
? Что он делает со вторым параметром конструктора? - person Sergey Berezovskiy   schedule 27.01.2014