2

我有一个自定义控件,其数据源类型为 IEnumerable(非泛型)。现在我想在数据源上实现分页,所以我需要 List-of-T 有的 Skip and Take 之类的东西。现在我正在使用以下内容:

List<object> pagingList = DataSource.Cast<object>().ToList()

我猜这可能效率低下,所以我正在寻找一种更好的方法来做到这一点。用两个计数器枚举集合、跳过元素等可能更有效,但它太丑了,我只是不想这样做。但也许这是最好的选择?

4

2 回答 2

10

你为什么打电话ToList()?您可以使用SkipTake不使用它:

IEnumerable<object> paged = DataSource.Cast<object>()
                                      .Skip(page * pageSize)
                                      .Take(pageSize);

这将节省将整个数据源转换为列表的时间——但这确实意味着当源不是IList<T>.

不过有两个重要问题:

  • 您提到您猜测您的原始代码效率低下……您测量了吗?这些数据有多大,它在内存中的形式是什么?你还用它做什么?这真的是瓶颈吗?收集事实而不是猜测。
  • 如果你有一个通用的数据源,那么以各种方式使用你的数据会更容易......你能做到吗?
于 2012-12-03T06:42:51.443 回答
1

考虑到 LINQ 扩展方法的实现方式,我认为这不会太低效。如果你真的想要,你可以为 IEnumerable 实现Skip()and的扩展方法Take(),但我认为没有必要。

尝试代码对阅读它的人最有意义的方法是个好主意,然后如果你发现它执行不充分并且分析器说这部分是罪魁祸首,则返回并更改它。

于 2012-12-03T06:41:56.310 回答