2013-12-19 1 views

Antwort

32

Der nächste ist wirklich LINQ .Skip() und .Take()

Beispiel:

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 Sie haben mich zu den schwierigeren Beispielen geschlagen, während ich MSDN-URLs ergriff :-) Diese gehört Ihnen. Darf ich vorschlagen, 'result1',' result2' zu verwenden, um den Beispielen des OP zu entsprechen? –

+0

Will do, danke – Ben

+0

Ich wünschte, ich könnte Python (Arbeitsprojekt) verwenden, aber ich denke, ich werde mich mit diesem hässlichen Zeug begnügen müssen, wo ich eigentlich denken muss, wenn ich es lese. – LJNielsenDk

2

Auf diese Weise müssen Sie nicht subtrahieren

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

Fügen Sie Ihrer Antwort eine Erläuterung hinzu – HaveNoDisplayName

1

Wenn Sie eine List haben GetRange kann nützlich sein.

von MSDN Link:

eine flache Kopie einer Sammlung von Referenztypen oder einer Untergruppe dieser Sammlung, enthält nur die Verweise auf die Elemente der Kollektion . Die Objekte selbst werden nicht kopiert. Die Referenzen in der neuen Liste verweisen auf die gleichen Objekte wie die Referenzen in der Originalliste .

Die Slice Funktion kann dann sein:

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

Negative Bereiche dass Python Scheibe Träger können auch mit einem gewissen Verlust an Sauberkeit behandelt werden.