日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 中 System.Range 结构体

發(fā)布時(shí)間:2023/12/4 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 中 System.Range 结构体 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

翻譯自 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)該是:

foreach (var item in array[1..6]) {Console.WriteLine(item); }

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è)范圍。

譯者注
它也等同于下面兩種寫法:

foreach (var item in array[0..^0]) {Console.WriteLine(item); } foreach (var item in array[0..array.Length]) {Console.WriteLine(item); }

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?相同。如下面代碼中的注釋所示:

string[] words = new string[] {// index from start index from end"The", // 0 ^9"quick", // 1 ^8"brown", // 2 ^7"fox", // 3 ^6"jumped", // 4 ^5"over", // 5 ^4"the", // 6 ^3"lazy", // 7 ^2"dog" // 8 ^1 }; // 9 (or words.Length) ^0

一個(gè)范圍指定了范圍的“開始”和“末尾”。范圍是左閉右開的,也就是說范圍包含“開始”,不包含“末尾”。范圍?[0..sequence.Length]、[0..^0]和?[..]?都表示整個(gè)范圍。

作者 :John Demetriou
譯者 :技術(shù)譯民
出品 :技術(shù)譯站(https://ITTranslator.cn/)

END

總結(jié)

以上是生活随笔為你收集整理的C# 中 System.Range 结构体的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。