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