C# 中 System.Range 结构体
翻譯自 John Demetriou 2020年4月6日 的文章?《C# 8 Is Introducing Ranges》
我們之前討論過的 C# 中的一個特性?System.Index 結構體,與另一特性?System.Range 結構體?是攜手并進的。
在 C# 8.0 之前,沒有訪問集合中任意部分的范圍或切片的語法。開發人員通常不得不執行一些自定義的切片操作,或者依靠諸如?array.Skip(5).Take(2);?的 LINQ 方法。
現在 C# 添加了一個新的小特性,它可以幫助人們從一個大的數組項目中獲取一個小范圍的項目。
讓我們來考慮一下。假設我們有一個項目數組,我們僅需展示其中的一部分。通常情況下,我們只需要循環這部分,然后像下面這樣輸出它們。
var array = new string[]{"Item0","Item1","Item2","Item3","Item4","Item5","Item6","Item7","Item8","Item9"};for (int i = 1; i <= 5; i++) {Console.WriteLine(array[i]); }因此當我們僅需要幾個特定的項,我們通過控制索引值來獲取它們。
通過使用范圍(Range),我們可以用以下方式來替換:
var array = new string[]{"Item0","Item1","Item2","Item3","Item4","Item5","Item6","Item7","Item8","Item9"};foreach (var item in array[1..5]) {Console.WriteLine(item); }在這里,第一次使用的人會注意到一個奇怪的情況——它只會打印四項。為什么呢?這是因為范圍(Range)包含開始,但不包含末尾。
如果想要與上面的?for?循環有相同的結果,我們的?foreach?循環應該是:
Range 的一些示例
1、從索引 1(包含) 到末尾(包含)
foreach (var item in array[1..]) {Console.WriteLine(item); }2、從開始(包含)到索引 3(不包含)
foreach (var item in array[..3]) {Console.WriteLine(item); }3、結合以上兩種,您可以得到一個語法上正確的以下版本
foreach (var item in array[..]) {Console.WriteLine(item); }它的意思是獲取整個范圍。
譯者注
它也等同于下面兩種寫法:
4、從索引 1(包含)到?從末尾開始的索引 1(不包含)
foreach (var item in array[1..^1]) {Console.WriteLine(item); }在這里,它結合了前面文章中介紹的?Index?的 Hat 運算符(^)。
一個快速的解釋,Hat 運算符(^),會給您一個特定的索引。如果您寫?^1,也就是在請求最后一項的索引。如上所述,考慮到最后一個索引號是排除的,在一個有 10 項的序列中,請求索引項直到?^1,您也就是在請求索引項直到索引 9(索引從 0 開始),并且該項不包括在其中。
我希望我講清楚了。
將范圍作為變量
我們前面所做的是,將范圍(Range)作為類型傳遞。我們也可以將范圍聲明為一個變量:
Range range = 1..9;然后,可以在?[?和?]?字符中使用該范圍:
var subarray = array[range];我們還可以將其作為方法的參數傳遞、將其存儲為私有變量,或者用在任何業務邏輯所需的地方。
范圍的類型支持
范圍(Range)不能被用在?List?或者?IEnumerable<Τ>,但數組并不是唯一支持它的類型。
您還可以將索引(Index)和范圍(Range) 與?String、Span<T>?或?ReadOnlySpan<T>?一起使用。
與字符串一起使用的例子基本上就是代替?Substring?方法,如下所示:
string s = "01234567"; string r = s[1..3]; // r 將會是 "12"對于每個擔心?List(它可能是您通常用來替代數組的類型)不支持范圍的人來說,List?從 .Net Framework 2.0 開始就已經有?GetRange?方法了。
以下為譯者補充
索引和范圍總結
索引(Index)和范圍(Range)為訪問序列中的單個元素或范圍提供了簡潔的語法。
對索引和范圍的語言支持依賴于兩個新類型和兩個新運算符:
System.Index?類型表示一個序列索引。
Hat 運算符(^),指定一個索引與序列末尾相關,用于構造?System.Index?對象。
System.Range?類型表示序列的子范圍。
范圍運算符?..,用于指定范圍的開始和末尾,就像操作數一樣,用于構造?System.Range?對象。
考慮數組?sequence,?0?索引與?sequence[0]?相同。?^0?索引與?sequence[sequence.Length]?相同。請注意,sequence[..^0]?不會引發異常,就像?sequence[..sequence.Length]?一樣。對于任意數字?n,索引?^n?與?sequence.Length - n?相同。如下面代碼中的注釋所示:
一個范圍指定了范圍的“開始”和“末尾”。范圍是左閉右開的,也就是說范圍包含“開始”,不包含“末尾”。范圍?[0..sequence.Length]、[0..^0]和?[..]?都表示整個范圍。
作者 :John Demetriou
譯者 :技術譯民
出品 :技術譯站(https://ITTranslator.cn/)
END
總結
以上是生活随笔為你收集整理的C# 中 System.Range 结构体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络知识 | 《图解HTTP》读书笔记(
- 下一篇: 浅议C#客户端和服务端通信的几种方法:R