c#8中的范围和索引类型是什么?

Ham*_*aei 6 c# c#-8.0

在c#8中,向System名称空间添加两个新类型,如下所示:

System.Index 
Run Code Online (Sandbox Code Playgroud)

System.Range
Run Code Online (Sandbox Code Playgroud)

这些课程的工作方式以及何时可以使用它们?

Mag*_*ron 8

它们用于索引和切片。来自微软的博客

索引:

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"
Run Code Online (Sandbox Code Playgroud)

范围(切片):

我们还引入了一个Range类型,该类型由两个Index组成,一个为开始,一个为结束,可以用x..y范围表达式编写。然后,可以使用Range进行索引以生成切片:

var slice = a[i1..i2]; // { 3, 4, 5 }
Run Code Online (Sandbox Code Playgroud)

您可以使用它们ArrayString[ReadOnly]Span[ReadOnly]Memory类型,让你有一种方法能使得字符串:

string input = "This a test of Ranges!";
string output = input[^7..^1];
Console.WriteLine(output); //Output: Ranges
Run Code Online (Sandbox Code Playgroud)

您还可以省略范围的第一个或最后一个索引:

output = input[^7..]; //Equivalent of input[^7..^0]
Console.WriteLine(output); //Output: Ranges!

output = input[..^1]; //Equivalent of input[0..^1]
Console.WriteLine(output); //Output: This a test of Ranges
Run Code Online (Sandbox Code Playgroud)

您还可以将范围保存到变量中,并在以后使用它们:

Range r = 0..^1;
output = input[r];
Console.WriteLine(output);
Run Code Online (Sandbox Code Playgroud)

  • 那么从末端开始的索引是基于 1 的,而从末端开始的范围是基于 0 的?这很混乱。 (2认同)
  • @Maxter最好将索引视为指字符之间的间隙。0 在第一个字符之前;1 位于第一个和第二个之间,^1 位于倒数第二个与最后一个之间,^0 位于最后一个之后。范围始终选择两个间隙之间的字符。访问单个元素总是会给出间隙之后的元素。 (2认同)