IEnumerable跳过并采取

时间:2012-12-03 06:38:26

标签: c# generics

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

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

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

2 个答案:

答案 0 :(得分:8)

你为什么打电话给ToList()?您不能使用SkipTake

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

这将保存将整个数据源转换为列表 - 但 意味着当源不是IList<T>时,您无法有效跳过。

但有两个重要问题:

  • 你提到你你的原始代码是低效的...你测量过吗?这些数据有多大,它在内存中的形式是什么?你还用它做什么?这真的是一个瓶颈吗?收集事实而不是猜测。
  • 如果您拥有通用数据源,那么以各种方式使用您的数据会更容易......这是您可以实现的目标吗?

答案 1 :(得分:1)

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

最好尝试一种方法,其中代码对读取它的人最有意义,然后如果发现它执行不当而返回并更改它,并且分析器说这部分是罪魁祸首。