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 spa

 

C# 8 Range類型 

而C# 8裏面咱們能夠從一個序列裏面很簡單的提取出來一個子範圍組成新的序列。 設計

看例子: orm

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

這裏面使用了範圍運算符..」。 xml

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 類型和 ^ 操做符

直接看例子: get

這裏使用了末尾運算符(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 運算符^ 

相關文章
相關標籤/搜索