• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

说说C# 8.0 新增功能Index和Range的^0是什么?

其他 Crazy Struggle 2943次浏览 0个评论

前言

  在《C# 8.0 中使用 Index 和 Range》这篇中有人提出^0是什么意思?处于好奇就去试了,结果抛出异常。查看官方文档说^0索引与 sequence[sequence.Length] 相同,表达式 sequence[^0] 不会引发异常,就像 sequence[sequence.Length] 一样。但是在实际使用[^0]的时候抛出IndexOutOfRangeException的异常,很疑惑究竟是什么原因?

  先说一下 C# 8.0 新增的两个新类型和两个新运算符,允许构造System.Index和System.Range对象,并在运行时索引/切片集合。

一、System.Index和System.Range结构

1、Index

  表示一种可用于从开头或从结尾索引集合的类型。

public struct Index : IEquatable<Index> 

  示例代码

string [] myArray = new string[5] { "A", "B", "C", "D", "E" };
string  strArray= myArray[^1]; // strArray = E

  代码中使用末尾运算符^和Index类型,myArray[ ^1] 表示从数组的倒数第一个元素,也就是从末尾开始算的第一个元素,所以最终结果是:E。

  Hat运算符(^)的索引,指定一个索引与序列末尾相关。

2、Range

  表示具有起始索引和结束索引的范围。

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

3、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   相同  表示全部从头到尾

二、[^0]会抛异常

1、[^1] 示例代码

int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int num = myArray[^1];   //num=10

2、[^0]示例代码

int[] myArray = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int num = myArray[^0]; //抛异常

  代码结果如下图所示:

     说说C# 8.0 新增功能Index和Range的^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开始,目前还没有找到具体原因,如果大家有好的解释和方法,欢迎留言沟通和交流。

四、总结

  1、Range类型  运算符(..)包括Start不包括End

  2、Index类型 末尾运算符(^)

    · 从头开始的索引是从0开始的

    · 从尾部开始的索引是从1开始的,与序列的长度相关

  3、减少 SubString 的使用,eg:var str=”12345″截取后三位,之前写法str.Substring(2,3),新语法str[^3..]

  4、使用^和..这两个语法糖,让代码更加干净,可读,易维护

 

 优秀是一种习惯,欢迎大家关注学习  

说说C# 8.0 新增功能Index和Range的^0是什么?


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明说说C# 8.0 新增功能Index和Range的^0是什么?
喜欢 (0)

您必须 登录 才能发表评论!

加载中……