在《C# 8.0 中使用 Index 和 Range》这篇中有人提出^0是什么意思?处于好奇就去试了,结果抛出异常。查看官方文档说^0索引与 sequence[sequence.Length] 相同,表达式 sequence[^0] 不会引起异常,就像 sequence[sequence.Length] 同样。可是在实际使用[^0]的时候抛出IndexOutOfRangeException的异常,很疑惑到底是什么缘由?数组
先说一下 C# 8.0 新增的两个新类型和两个新运算符,容许构造System.Index和System.Range对象,并在运行时索引/切片集合。学习
一、Index spa
表示一种可用于从开头或从结尾索引集合的类型。code
public struct Index : IEquatable<Index>
示例代码xml
string [] myArray = new string[5] { "A", "B", "C", "D", "E" }; string strArray= myArray[^1]; // strArray = E
代码中使用末尾运算符^和Index类型,myArray[ ^1] 表示从数组的倒数第一个元素,也就是从末尾开始算的第一个元素,因此最终结果是:E。对象
Hat运算符(^)的索引,指定一个索引与序列末尾相关。blog
二、Range索引
表示具备起始索引和结束索引的范围。token
public struct Range : IEquatable<Range>
示例代码文档
string[] myArray = new string[5] { "A", "B", "C", "D", "E" }; string[] strArray = myArray[0..2]; // { A, B }
代码中使用范围运算符(..)和Range类型,myArray[0..2]表示把myArray这个序列,从索引为0的元素一直找到索引为2(但不包括索引2)的元素提取出来组成新的数组,因此最终结果是: {A,B}。
范围运算符(..),用于指定范围的开始和末尾,就像操做数同样。
Range类型范围运算符包含start不包含end。eg:myArray[0..2]包含索引0不包含索引2
三、Index和Range组合使用
尝试在Range的两端混合使用"从开始"和"从末尾"的Index,看看会发生什么?
var strNum = new string[] { // index from start index from end "A", // 0 ^9 "B", // 1 ^8 "C", // 2 ^7 "D", // 3 ^6 "E", // 4 ^5 "F", // 5 ^4 "G", // 6 ^3 "H", // 7 ^2 "I" // 8 ^1 }; // 9 (strNum.Length) ^0 foreach (var item in strNum[0..^1]) Console.Write($"{item}"); foreach (var item in strNum[1..^0]) Console.Write($"{item}"); foreach (var item in strNum[0..^0]) Console.Write($"{item}");
输出结果:
ABCDEFGH
BCDEFGHI
ABCDEFGHI
0..^1 与 ..^1 相同 表示从0索引位置到末尾开始算的第1个元素
1.. 与 1..^0 相同 表示从1索引位置到末尾开始算的第0个元素
.. 与 0..^0 相同 表示所有从头至尾
一、[^1] 示例代码
int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int num = myArray[^1]; //num=10
二、[^0]示例代码
int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int num = myArray[^0]; //抛异常
代码结果以下图所示:
官方文档描述:请考虑数组 sequence。 0 索引与 sequence[0] 相同。 ^0 索引与 sequence[sequence.Length] 相同。 表达式 sequence[^0]不会引起异常,就像 sequence[sequence.Length] 同样。 对于任何数字 n,索引 ^n 与 sequence[sequence.Length - n] 相同。
经过本身搜索到合理的解释 Index 类型 从尾部开始的索引是从1开始的,与序列的长度相关,那么意思就说单独使用末尾运算符时索引只能从1开始。
使用末尾运算符时索引只能从1开始,可是Index和Range组合使用时能够从0开始,目前尚未找到具体缘由,若是你们有好的解释和方法,欢迎留言沟通和交流。
一、Range类型 运算符(..)包括Start不包括End
二、Index类型 末尾运算符(^)
· 从头开始的索引是从0开始的
· 从尾部开始的索引是从1开始的,与序列的长度相关
三、减小 SubString 的使用,eg:var str="12345"截取后三位,以前写法str.Substring(2,3),新语法str[^3..]
四、使用^和..这两个语法糖,让代码更加干净,可读,易维护
优秀是一种习惯,欢迎你们关注学习