在网格中使用IEnumerables

时间:2010-11-09 10:21:29

标签: list count ienumerable

我有一个IEnumerable<GridItem> items,其中包含数千个项目的列表,每个项目都包含一些非常复杂的计算属性。

为了提高性能,可以在网页网格中一次查看一页(20条记录)。

问题
如果要向用户显示网格的分页信息,您需要找出有多少总记录,即items.Count(),然后基本上将IEnumerable转换为List评估所有属性和需要多年的时间!

有解决方法吗?

3 个答案:

答案 0 :(得分:2)

通常,在迭代IEnumerable时,您不必评估GridItem的属性。您可以跳过计算,直到它们被首先使用,或懒惰地评估属性(当它们被读取时)。

我的意思是说,你可以有一个像在构造之后计算的Calculate()这样的函数,或者你可以在属性/相关函数的getter中完成计算。

您还可以从GridItem(例如数据库)的来源获取计数(总数)或记录,而不是哪个IMO更好。

答案 1 :(得分:0)

如何创建自己的继承自GridItem的类(它允许您将其绑定到网格),还实现了一个接口?当您需要获取计数时,可以将IEnumerable转换为接口,并获取该列表。我认为这会绕过调用你正确的MyGridItem类的ToList。

例如:

    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;

答案 2 :(得分:0)

问题已解决

Count()上执行IEnumerable将枚举该集合。但是,这与将IEnumerable转换为List不同,例如.ToList()(实际上会评估列表中实体的所有属性)

当天结束时,IEnumerable.Count()可能会很慢,但那并不是因为它枚举了所有IEnumerable对象的属性

如果这种理解不正确,有人会谴责我?!)