C# 8 – Range 和 Index(範圍和索引)

  • 2019 年 10 月 15 日
  • 筆記

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 運算符^