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

What are Range and Index types in C# 8?

在 C# 8 中,System 命名空间中添加了两个新类型:System.Index and System.Range

它们是如何工作的,我们什么时候可以使用它们?

它们用于索引和切片。 来自 Microsoft's blog:

索引:

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"

范围(切片):

We’re also introducing a Range type, which consists of two Indexes, one for the start and one for the end, and can be written with a x..y range expression. You can then index with a Range in order to produce a slice:

var slice = a[i1..i2]; // { 3, 4, 5 }

您可以在 ArrayString[ReadOnly]Span[ReadOnly]Memory 类型中使用它们,因此您有另一种方法来制作子字符串:

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

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

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

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

Range r = 0..^1;
output = input[r];
Console.WriteLine(output);

System.Index 从结尾索引集合的好方法。 (可用于从头或尾获取集合)

System.Range 访问 "ranges" 或 "slices" 集合的范围方式。这将帮助您避免使用 LINQ 并使您的代码紧凑且更具可读性。 (访问集合中的子集合(切片))。

更多信息在我的文章中:

https://www.c-sharpcorner.com/article/c-sharp-8-features/

https://www.infoq.com/articles/cs8-ranges-and-recursive-patterns