Использование IEnumerables с сеткой - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть IEnumerable<GridItem> items, содержащий список из тысяч предметов, каждый из которых содержит некоторые очень сложные вычисляемые свойства.

Для повышения производительности список можно просматривать по одной странице (20 записей) за раз в сетке веб-страниц.

ПРОБЛЕМА
Если вы хотите отобразить информацию о разбивке по сетке для пользователя, вам необходимо выяснить, сколько всего записей есть, т.е. items.Count(), которая затем в основном преобразует IEnumerable в List оценки ВСЕХ свойств и возрастов для этого!

Есть ли способ обойти это?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

Как правило, вам не нужно оценивать свойства GridItem при итерации по IEnumerable. Вы можете пропустить вычисления, пока они не будут использованы первыми, или оценить свойства лениво (когда они прочитаны).

Я имею в виду, что у вас может быть такая функция, как Calculate (), которая вычисляется после построения, или вы можете выполнять вычисления в получателе свойств / соответствующих функций.

Вы также можете получить количество (общее количество) или записи из источника GridItem (например, базы данных), какой IMO лучше.

0 голосов
/ 01 ноября 2011

ПРОБЛЕМА РЕШЕНА

Выполнение Count() на IEnumerable перечислит коллекцию. Однако это НЕ то же самое, что преобразование IEnumerable в List, например. .ToList() (который фактически оценил бы все свойства объектов в списке)

Конец дня, IEnumerable.Count () может быть медленным, но это не потому, что он перечисляет все свойства объектов IEnumerable

( ПОЖАЛУЙСТА кто-нибудь сделает мне выговор, если это понимание неверно?!)

0 голосов
/ 13 декабря 2010

Как насчет создания вашего собственного класса, который наследуется от GridItem (который позволяет вам все еще привязывать его к сетке), а также реализует интерфейс? Когда вам нужно получить количество, вы можете привести IEnumerable к интерфейсу и получить список для этого. Я думаю, что это обойдёт вызов ToList вашего правильного класса MyGridItem.

Например:

    public class MyGridItem : GridItem, IMyGridItem
    {
    }

    public interface IMyGridItem
    {
     // Just an empty interface
    }

    // Code to get the count
    IEnumerable<MyGridItem> items;

    List<IMyGridItem> castList = items.Cast<IMyGridItem>().ToList();

    int count = castList.Count;

...