C#8中的Range和Index(范围和索引)
来源: https://note.guoqianfan.com/2...Range-范围 范围运算符
- 范围运算符:
..
,它会生成一个Range
对象。 - 语法:
{startIndex}..{endIndex}
:包含startIndex
,不包含endIndex
- 限制:0 <=
startIndex
<=endIndex
<=arr.Length
,其他均会报错!
startIndex
等于endIndex
时,取不出元素,会生成一个空数组。
- 默认情况下,
..
的前面是0
,后面是arr.Length
(不含)。..
等价于0..arr.Length
。 - 所以
..
的前面和后面均可以为空。 - 所以
..
也可以单独使用,代表整个索引范围(0..arr.Length
):arr[..]
是arr
的完整拷贝。
值类型
还是引用类型
。值类型
复制值,可以认为是深拷贝;引用类型
复制引用,就是浅拷贝。Range
Range
用来从集合中取出 指定索引范围 的元素来生成新的集合。创建
Range
:Range range = 2..4;
var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range range = 2..4;
int[] slice = arr[range];
// 或 arr[2..4];
foreach (var number in slice)
{// [3, 4]
Console.WriteLine(number);
}
arr[2..4]
表示把arr
这个序列,从索引为2的元素一直到索引为4(不含4)的元素提取出来组成新的序列。所以结果就是3,4。Index-索引
Index
用来指定索引。该索引可以用来从集合中取出指定索引处的元素,是单个元素。乍一看,
Index
与int类型的索引
没啥区别。嗯。。确实是这样,因为Index
要与^
操作符结合起来才能发挥更大的作用。对了,还有Range
。。末尾运算符
^
是末尾运算符(Hat运算符),它会生成一个Index
对象,用来从末尾
开始往前取数据。与正向取数据时索引从0开始不同,
^
取数据时是从1开始的,代表倒数第一个元素。arr[^1]
等于arr[arr.Length-1]
,最后一个元素arr[^0]
等于arr[arr.Length]
,常与Range
组合使用
arr[^0]
的话就会抛出IndexOutOfRangeException
,arr[^0]
和arr[arr.Length]
是一个意思。这确实有点容易让人混淆,但其实其它语言也差不多是这样设计的,例如
-1
这个索引表示最后一个元素。组合使用 Range 和 Index 完整拷贝数组的3种方式
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr01 = arr[0..arr.Length];
int[] arr02 = arr[0..^0];
int[] arr03 = arr[..];
【C#8中的Range和Index(范围和索引)】注意:
- Range的范围包含Start,不包含End。
- 所以索引为0的元素包含,索引为10或者
^0
的元素不包含(尽管也不存在)。
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr01 = arr[..];
//完整的复制,数组
int[] allButFirst = arr[1..];
//不包含第一个元素的数组
int[] empty = arr[^0..];
//空数组
int[] onlyLastItem = arr[^1..];
//只包含最后一个元素的数组
int[] last4Items = arr[^4..];
//只包含最后四个元素的数组
int lastItem = arr[^1];
//最后一个元素
单独使用Range或Index
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Index middle = 4;
Index threeFromEnd = ^3;
Range range = middle..threeFromEnd;
int[] mySlice = arr[range];
//5, 6, 7
参考
- C# 8 - Range 和 Index(范围和索引):https://mp.weixin.qq.com/s?__...,好文,强烈推荐!!
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 如何在Mac中的文件选择框中打开系统隐藏文件夹