C#8.0新特性之Index、Range类型

什么是Index、Range类型

这是C#8.0带来的两个新的类型,System.IndexSystem.Range,借助对应的两个运算符 ^..,让我们很方便就可以获取序列中某个或一段元素。

System.Index

System.Index表示索引类型,^指定的索引是相对于序列尾端。如^2表示从序列尾端、从右至左的第二个元素。这里始终记住 ^x等价于 list.length - x ,所以如果代码写成 list[^0],那么等价于 list[list.length-0],结果就会抛出异常。下边举例说明。

var list = new[]
{
    "我","爱","中","华","人","民","共","和","国"
};

System.Index idx1 = 0;
System.Index idx2 = ^0;
var idx3 = ^1; //var简写

Console.WriteLine(list[idx1]); //打印 我
Console.WriteLine(list[idx2]); //报错
Console.WriteLine(list[idx3]); //打印 国
Console.WriteLine(list[^2]);   //也可以直接写 ^2 ,打印 和

System.Range

System.Range表示序列的子范围,使用运算符x..y,表示取序列中x到y的一段数据,但不包括y。再举例说明

var rng1 = ..; //声明一个Range类型的变量
var rng2 = 2..;
var list = new[]
{
    "我","爱","中","华","人","民","共","和","国"
};

Console.WriteLine(string.Join("",list[rng1]));
//取全部,打印 我爱中华人民共和国

Console.WriteLine(string.Join("",list[rng2]));
//取2到后边所有,打印 中华人民共和国

Console.WriteLine(string.Join("",list[2..4]));
//取2到4,但不包括4,打印 中华

Console.WriteLine(string.Join("",list[..4]));
//取开始到4,但不包括4,打印 我爱中华

混合使用 Index、Range

var list = new[]
{
    "我","爱","中","华","人","民","共","和","国"
};

Console.WriteLine(string.Join("",list[^2..^0]));
//取倒数第二个至后边所有,打印 和国
//有人问为什么这里 ^0 不会报错,因为范围取值不包括后边

Console.WriteLine(string.Join("",list[^2..^6]));
//猜猜这个会报错吗?