起源: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[..];
留神:
- 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?__…,好文,强烈推荐!!
发表回复