C# 8 - Range 和 Index(范围和索引)

C# 7  Span 

C# 7 里面出现了Span这个数据类型,它可以表示另一个数据结构里连续相邻的一串数据,并且它是内存安全的。 

例子: 

var arr = 
2, 
new[] 
slice - 
arr. 
AsSpan(). 
Slice( 
start: 
4); 
length: 
foreach (var number in slice) 
Console . WriteLine( number);

这个图的输出是3456 

 

C# 8 Range类型 

而C# 8里面我们可以从一个序列里面很简单的提取出来一个子范围组成新的序列。 

看例子: 

5, 
9, 
var arr = 
new[] {1, 2, 3 
6 
int[] slice = 
arr[2 „ 4]; 
foreach (var number in slice) 
Console . WriteLine( number);

这里面使用了范围运算符..”。 

arr[2..4]表示把arr这个序列,从索引为2的元素一直到索引为4(但不包括索引4)的元素提取出来组成新的序列。所以结果就是34 

 

Range类型 

也可以直接创建Range类型的变量: 

, 4,5 
9, 
var arr = 
new[] {1, 2, 3 
6 
Rgnge range = 2.. 4; 
int[] slice = 
arr[range] ; 
foreach (var i in slice) 
Console . WriteLine(i);

这段代码的输出结果和上面是一样的。 

 

C# 8 Index类型 

Index 类型和 ^ 操作符

直接看例子: 

这里使用了末尾运算符(Hat运算符) ^  Index这个类型。 

这里面的 ^2 表示从序列的倒数第二个元素,也就是从末尾开始算的第二个元素。所以输出是9 

 

而如果你使用arr[^0]的话就会抛出IndexOutOfRangeException,arr[^0]  arr[arr.Length] 是一个意思。 

这确实有点容易让人混淆,但其实其它语言也差不多是这样设计的,例如 -1 这个索引表示最后一个元素。 

 

组合使用 Range  Index 

Range和Index经常组合着使用。 

例如: 

这里arrTwin和arr的元素是完全一样的。 

 

这里还可以更简化一下写法: 

arrTwin 就是 arr 完整的拷贝。 

 

下面这三种写法的效果是一样的: 

 

再次强调,Range的范围包含Start不包含End 

所以索引为0的元素包含,索引为10或者^0的元素不包含(尽管也不存在)。 

 

其它一些例子: 

 

单独使用Range或Index的例子: 

这个输出结果是567 

 

总结一下: 

  • Range类型; 

    • 一定要注意Range的范围包括Start不包括End。 

  • Range运算符.. 

  • Index类型; 

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

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

  • Hat 运算符^ 

posted @ 2019-10-15 12:46  yangxu-pro  阅读(3626)  评论(10编辑  收藏  举报