Я как бы понимаю всю концепцию замедленного исполнения, но следующее меня озадачивает...
В DataTable, содержащем около 1000 строк, я вызываю AsEnumerable(). Затем я выбираю объекты, возвращаемые в IEnumerable строго типизированных классов (1)... Здесь, где я запутываюсь: я делаю цикл foreach в коллекции; выбирая материал из отдельных элементов в коллекции, используя кучу Where() calls (2)... И он мертв медленно.
-
DataTable.AsEnumerable().Select(r => new ObjectRepresentation { ... });
-
item.Where(i => i.SomeEnum == SomeEnum.Something)
... Но если я вызову ToList() сразу после моего вызова AsEnumerable() в DataTable, цикл foreach займет менее секунды.
Что мне здесь не хватает? Действительно ли я вызываю AsEnumerable() каждый раз, когда цикл повторяется? Или каждый раз, когда я получаю доступ к элементу коллекции? Или каждый раз, когда я делаю вызов Where() для элемента в коллекции? Или все вышеперечисленное?
Обновление
Несколько полный код:
public class ObjectRepresentation
{
public SomeEnum SomeEnum { get; set; }
}
var collection = DataTable.AsEnumerable().Select(r => new ObjectRepresentation
{
SomeEnum = (SomeEnum)Convert.ToInt32(r["SomeEnum"])
});
foreach(var item in collection) // slow loop
{
// 10 or so Where() calls on item inside this loop
}
collection = collection.ToList(); // Hit hyper speed button!
foreach(var item in collection) // fast loop
{
// 10 or so Where() calls on item inside this loop
}