In C# 8, two new types are added to the System namespace: System.Index
and System.Range
.
How do they work and when can we use them?
In C# 8, two new types are added to the System namespace: System.Index
and System.Range
.
How do they work and when can we use them?
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 variables and use them later:
Range r = 0..^1;
output = input[r];
Console.WriteLine(output);
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