可读的C#相当于Python切片操作

LJN*_*nDk 36 c# python equivalent slice

什么是C#等效的Python切片操作?

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:]
Run Code Online (Sandbox Code Playgroud)

这里有一些内容,但它很难看,并没有解决切片的所有用途,以至于没有明显回答这个问题.

Ben*_*Ben 54

最接近的是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));
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案不完整,因为它不支持负指数(例如,[ - 5:-4]). (4认同)
  • 我希望我可以使用Python(工作项目),但我想我将不得不接受这个丑陋的东西,在阅读它时我实际上必须思考它。 (2认同)
  • LINQ `SklpLast` 和 `TakeLast` 方法模仿负索引。 (2认同)

Ous*_* D. 11

C#8对于索引数据结构,切片变得更加容易。

var result1 = myList[2..5]; // end (5) is exclusive
var result2 = myList[1..^0]; // from index 1 to the end 
var result3 = myList[0..3]; // end (3) exclusive
Run Code Online (Sandbox Code Playgroud)

在这里这里阅读有关范围和索引的更多信息。

  • `List<T>` 不使用 `Range` 实现索引,并且 Range 模式需要一个名为 `Slice` 的成员,遗憾的是不支持扩展方法。 (8认同)

bas*_*hrc 10

如果你有一个List GetRange可以派上用场.

来自MSDN链接:

引用类型集合的浅表副本或该集合的子集仅包含对集合元素的引用.不复制对象本身.新列表中的引用指向与原始列表中的引用相同的对象.

Slice函数可以是:

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

python切片支持的负范围也可以通过一些清洁度的损失来处理.