【问题标题】:Using IEnumerables with a Grid将 IEnumerables 与网格一起使用
【发布时间】:2010-11-09 10:21:28
【问题描述】:

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

为了保持性能,可以在网页网格中一次查看一页(20 条记录)列表。

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

有没有办法解决这个问题?

【问题讨论】:

    标签: list count ienumerable


    【解决方案1】:

    一般来说,您不必在迭代 IEnumerable 时评估 GridItem 的属性。您可以跳过计算直到它们被第一次使用,或者懒惰地评估属性(当它们被读取时)。

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

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

    【讨论】:

    • IEnumerable 上执行Count 不会自动评估IEnumerable 中每个GridItem 的所有属性吗? (本质上是把它变成一个列表)
    【解决方案2】:

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

    例如:

    公共类 MyGridItem:GridItem,IMyGridItem { } 公共接口 IMyGridItem { // 只是一个空接口 } //获取计数的代码 IEnumerable 项; List castList = items.Cast().ToList(); int count = castList.Count;

    【讨论】:

      【解决方案3】:

      问题已解决

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

      最终,IEnumerable.Count() 可能会很慢,但这不是因为它枚举了所有 IEnumerable 对象的属性

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多