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