我有一个IEnumerable<GridItem> items
,其中包含数千个项目的列表,每个项目都包含一些非常复杂的计算属性。
为了提高性能,可以在网页网格中一次查看一页(20条记录)。
问题
如果要向用户显示网格的分页信息,您需要找出有多少总记录,即items.Count()
,然后基本上将IEnumerable
转换为List
评估所有属性和需要多年的时间!
有解决方法吗?
答案 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对象的属性
(请如果这种理解不正确,有人会谴责我?!)