2013-12-19 12 views
17

Pythonスライス操作と同等のC#は何ですか?Pythonスライス操作の読み込み可能なC#

my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
result1 = my_list[2:4] 
result2 = my_list[1:] 
result3 = my_list[:3] 
result4 = my_list[:3] + my_list[4:] 

Some of it is covered hereが、それは醜いあると明らかに質問に答えるないことのポイントにをスライスのすべての使用に対応していません。

答えて

32

最も近いが本当にLINQ .Skip().Take()

は例です:あなたはListGetRangeを持っている場合は、

public static IEnumerable<A> Slice<A> (int from, int to, IEnumerable<A> e) { 
    return e.Take (to).Skip (from); 
} 
+0

+1私はMSDN URLをつかんでいる間に、よりトリッキーな例に私を打ちました:-)これはあなたのものです。 OPの例に合わせて 'result1'、' result2'を使うことをお勧めしますか? –

+0

ありがとう、 – Ben

+0

私はPython(作業プロジェクト)を使用したいと思っていますが、私は実際に読んで考える必要があるこの醜いもののために解決しなければならないと思います。 – LJNielsenDk

2

この方法便利です。 MSDNのリンクから

参照型のコレクション、またはその コレクションのサブセットの浅いコピーは、 コレクションの要素への参照のみが含まれています。オブジェクト自体はコピーされません。 の参照は、新しいリストが 元のリストの参照と同じオブジェクトを指しています。

Slice機能は、することができます:pythonスライスがサポートも清潔いくつかの損失で処理できることを

public static IEnumerable<T> Slice<T>(this List<T> source, int from, int to) => source.GetRange(from, to - 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

を減算する必要はありません

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));