试过:
IList<T> list= (from ...linq...).ToList();
list = list.Skip(0).Take(10);
但似乎没有那些功能。还有其他方法吗?
答案 0 :(得分:10)
首先确保您引用System.Linq。
其次,扩展方法适用于严格类型的列表。所以使用list.OfType<object>().Skip(0).Take(10)
如果您知道列表中的项目属于特定类型,则用该类型替换对象。
第三,Skip(0)是多余的。
此外,您的代码示例尝试从IEnumerable分配给IList,您需要在结果上使用ToList()。
list = list.Skip(0).Take(10).ToList();
答案 1 :(得分:5)
你引用了System.Linq
吗?
using System.Linq;
答案 2 :(得分:5)
这些是在命名空间System.Linq中定义的方法扩展。一定要参考它:
using System.Linq;
答案 3 :(得分:4)
Skip
和Take
是IEnumerable<T>
的扩展程序。当您处理(非泛型)IList
时,这些将无法使用。但是,如果您知道IList
中的类型,那么这应该可以正常工作:
list.OfType<YourType>().Skip(1).Take(10)
这有效的原因是OfType<T>
是非通用IEnumerable
(IList
继承自)的扩展方法,并返回通用IEnumerable<T>
。
的引用:
OfType<T>
答案 4 :(得分:3)
如果您指的是非通用IList
,则需要先使用Cast
或OfType
来获取通用序列。如果您希望所有元素都是所需类型,请使用Cast
。如果要忽略“错误”类型的元素,请使用OfType
。 (我尽可能选择Cast
,因为如果我的数据不符合预期,我通常想要获取异常。)
例如:
IList list = ...;
var elements = list.Cast<string>()
.Skip(10)
.Take(20);
您还需要对System.Core程序集的引用和using
的{{1}}指令。
System.Linq
,问题就更清晰了。并不是找不到Skip和Take,而是他们没有返回IList<T>
。如果您将代码更改为:
IList<T>
它应该可以正常工作。