问题
In c# 8 add two new types to System namespace as
System.Index
and
System.Range
How work this classes and When can use them?
回答1:
They're used for indexing and slicing. From Microsoft's blog:
Indexing:
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"
Range (slicing):
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 }
You can use them in Array
, String
, [ReadOnly]Span
and [ReadOnly]Memory
types, so you have another way to make substrings:
string input = "This a test of Ranges!";
string output = input[^7..^1];
Console.WriteLine(output); //Output: Ranges
You can also omit the first or last Index of a Range:
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
You can also save ranges to varibles and use them later:
Range r = 0..^1;
output = input[r];
Console.WriteLine(output);
回答2:
Here's the recently-added overview of Index/Range in the .NET docs: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#indices-and-ranges
回答3:
System.Index Excellent way toindex a collection from the ending. (Which can be used to obtain the collection from the beginning or from the end).
System.Range Ranges way to access "ranges" or "slices" of collections. This will help you to avoid LINQ and making your code compact and more readable. (Access a sub-collection(slice) from a collection).
More Info in my articles:
https://www.c-sharpcorner.com/article/c-sharp-8-features/
https://www.infoq.com/articles/cs8-ranges-and-recursive-patterns
来源:https://stackoverflow.com/questions/55167287/what-is-range-and-index-types-in-c-sharp-8