C# IEnumerable跳转和跳转
我有一个自定义控件,其数据源类型为IEnumerable(非泛型)。现在我想在数据源上实现分页,所以我需要像Skip和Take这样的东西,这是List-of-T提供的。现在,我正在使用以下工具:C# IEnumerable跳转和跳转,c#,generics,C#,Generics,我有一个自定义控件,其数据源类型为IEnumerable(非泛型)。现在我想在数据源上实现分页,所以我需要像Skip和Take这样的东西,这是List-of-T提供的。现在,我正在使用以下工具: List<object> pagingList = DataSource.Cast<object>().ToList() List pagingList=DataSource.Cast().ToList() 我猜这可能是低效的,所以我正在寻找一种更好的方法。使用两个计数器枚举
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
时,您无法高效地跳过
但有两个重要问题:
- 你提到你猜你的原始代码是低效的。。。你量过尺寸了吗?这个数据有多大?它在内存中的形式是什么?你还用它干什么?这真的是一个瓶颈吗?收集事实而不是猜测
- 如果您有一个通用的数据源,那么以各种方式使用您的数据会更容易。。。这是你能做到的吗