我有一个自定义控件,其数据源类型为IEnumerable(非泛型)。现在我想在数据源上实现分页,所以我需要像Skip和Take这样的东西,它有List-of-T。现在我使用以下内容:
List<object> pagingList = DataSource.Cast<object>().ToList()
这可能是低效的,我猜,所以我正在寻找一种更好的方法来做到这一点。枚举集合,使用两个计数器跳过元素等可能会更有效,但它太丑了我只是不想这样做。但也许这是最好的选择?
答案 0 :(得分:8)
你为什么打电话给ToList()
?您不能使用Skip
和Take
:
IEnumerable<object> paged = DataSource.Cast<object>()
.Skip(page * pageSize)
.Take(pageSize);
这将保存将整个数据源转换为列表 - 但 意味着当源不是IList<T>
时,您无法有效跳过。
但有两个重要问题:
答案 1 :(得分:1)
考虑到LINQ扩展方法的实现方式,我不认为这样效率太低。如果你真的想,你可以为Skip()
和Take()
的IEnumerable实现扩展方法,但我认为没有必要。
最好尝试一种方法,其中代码对读取它的人最有意义,然后如果发现它执行不当而返回并更改它,并且分析器说这部分是罪魁祸首。