C# IEnumerable跳转和跳转

C# IEnumerable跳转和跳转,c#,generics,C#,Generics,我有一个自定义控件,其数据源类型为IEnumerable(非泛型)。现在我想在数据源上实现分页,所以我需要像Skip和Take这样的东西,这是List-of-T提供的。现在,我正在使用以下工具: List<object> pagingList = DataSource.Cast<object>().ToList() List pagingList=DataSource.Cast().ToList() 我猜这可能是低效的,所以我正在寻找一种更好的方法。使用两个计数器枚举

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

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

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

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


最好在代码对阅读它的人最有意义的地方尝试这种方法,如果您发现它的性能不好并且探查器说这一部分是罪魁祸首,则返回并更改它。

为什么要调用
ToList()
?您可以使用
Skip
Take
而不使用该选项:

IEnumerable<object> paged = DataSource.Cast<object>()
                                      .Skip(page * pageSize)
                                      .Take(pageSize);
IEnumerable paged=DataSource.Cast()
.跳过(页面*页面大小)
。取(页面大小);
这将节省将整个数据源转换为列表的时间,但这确实意味着当源不是
IList
时,您无法高效地跳过

但有两个重要问题:

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

好的,现在我要多做一份:)谢谢@埃拉德拉赫米:我不知道你的意思。迭代上面的查询不会创建整个页面的内存中副本。它只会一次产生一个值。不,我没有测量,但是跳过列表转换使这个问题值得一问。我不需要测量就知道……:)如果可以,我会使用泛型类型,但我不能。。。