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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM