如何.skip()。 IList上的take()元素?

时间:2011-08-11 08:43:06

标签: c#

试过:

IList<T> list= (from ...linq...).ToList();
list = list.Skip(0).Take(10);

但似乎没有那些功能。还有其他方法吗?

5 个答案:

答案 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)

SkipTakeIEnumerable<T>的扩展程序。当您处理(非泛型)IList时,这些将无法使用。但是,如果您知道IList中的类型,那么这应该可以正常工作:

list.OfType<YourType>().Skip(1).Take(10)

这有效的原因是OfType<T>是非通用IEnumerableIList继承自)的扩展方法,并返回通用IEnumerable<T>

的引用:   OfType<T>

答案 4 :(得分:3)

如果您指的是非通用IList,则需要先使用CastOfType来获取通用序列。如果您希望所有元素都是所需类型,请使用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>

它应该可以正常工作。