2010-11-09 2 views
0

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

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

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

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

ответ

0

задача, решаемая

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

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

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

2

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

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

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

+0

Выполняет ли 'Count' на' IEnumerable' автоматически не оценивает все свойства каждого 'GridItem' в' IEnumerable'? (по существу превращая его в список) – Jimbo

0

Как насчет создания собственного класса, который наследует 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;