2013-12-19 23 views

回答

32

最接近的是真的LINQ .Skip().Take()

例子:

var result1 = myList.Skip(2).Take(2); 
var result2 = myList.Skip(1); 
var result3 = myList.Take(3); 
var result4 = myList.Take(3).Concat(myList.Skip(4)); 
+0

+1当我抓取MSDN网址时,你可以将我惹到棘手的例子:-)这是你的。我可以建议使用'result1','result2'来匹配OP的例子吗? –

+0

会这样做,谢谢 – Ben

+0

我希望我可以使用Python(工作项目),但我想我必须解决这个丑陋的东西,在阅读时我实际上必须考虑这些东西。 – LJNielsenDk

2

这样你就不必扣除

public static IEnumerable<A> Slice<A> (int from, int to, IEnumerable<A> e) { 
    return e.Take (to).Skip (from); 
} 
1
public static T[] slice<T>(T[] l, int from, int to) 
{ 
    T[] r = new T[to - from]; 
    for (int i = from; i < to; i++) 
    { 
     r[i-from]=l[i]; 
    } 
    return r; 
} 
+4

将解释添加到您的答案 – HaveNoDisplayName

1

如果你有一个ListGetRange可以派上用场。

从MSDN链接:

引用类型的集合,或者说 集合的子集的浅拷贝,只包含对 集合中的元素的引用。对象本身不被复制。 中的参考新列表指向与原始列表中 原始列表中的参考相同的对象。

Slice函数然后可以:

public static IEnumerable<T> Slice<T>(this List<T> source, int from, int to) => source.GetRange(from, to - from); 

负范围即蟒片支撑件也可以与洁净度的一些损失来处理。