來(lái)源:https://note.guoqianfan.com/2021/07/13/Range-and-Index-in-csharp
Range-范圍
范圍運(yùn)算符
范圍運(yùn)算符:
..
琐凭,它會(huì)生成一個(gè)Range
對(duì)象傅物。語(yǔ)法:
{startIndex}..{endIndex}
:包含startIndex
猎唁,不包含endIndex
-
限制:0 <=
startIndex
<=endIndex
<=arr.Length
,其他均會(huì)報(bào)錯(cuò)洒扎!startIndex
等于endIndex
時(shí),取不出元素碎浇,會(huì)生成一個(gè)空數(shù)組腾它。
注意:
- 默認(rèn)情況下,
..
的前面是0
碗誉,后面是arr.Length
(不含)召嘶。..
等價(jià)于0..arr.Length
。 - 所以
..
的前面和后面均可以為空哮缺。 - 所以
..
也可以單獨(dú)使用苍蔬,代表整個(gè)索引范圍(0..arr.Length
):arr[..]
是arr
的完整拷貝。
深拷貝還是淺拷貝需要看元素是值類型
還是引用類型
蝴蜓。值類型
復(fù)制值碟绑,可以認(rèn)為是深拷貝;引用類型
復(fù)制引用茎匠,就是淺拷貝格仲。
Range
Range
用來(lái)從集合中取出 指定索引范圍 的元素來(lái)生成新的集合。
創(chuàng)建Range
:Range range = 2..4;
var arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Range range = 2..4;
int[] slice = arr[range]; // 或 arr[2..4];
foreach (var number in slice)
{// [3, 4]
Console.WriteLine(number);
}
arr[2..4]
表示把arr
這個(gè)序列诵冒,從索引為2的元素一直到索引為4(不含4)的元素提取出來(lái)組成新的序列凯肋。所以結(jié)果就是3,4汽馋。
Index-索引
Index
用來(lái)指定索引侮东。該索引可以用來(lái)從集合中取出指定索引處的元素圈盔,是單個(gè)元素。
乍一看悄雅,Index
與int類型的索引
沒啥區(qū)別驱敲。嗯。宽闲。確實(shí)是這樣众眨,因?yàn)?code>Index要與^
操作符結(jié)合起來(lái)才能發(fā)揮更大的作用。對(duì)了容诬,還有Range
娩梨。。
末尾運(yùn)算符
^
是末尾運(yùn)算符(Hat運(yùn)算符)览徒,它會(huì)生成一個(gè)Index
對(duì)象狈定,用來(lái)從末尾
開始往前取數(shù)據(jù)。
與正向取數(shù)據(jù)時(shí)索引從0開始不同习蓬,^
取數(shù)據(jù)時(shí)是從1開始的掸冤,代表倒數(shù)第一個(gè)元素。
-
arr[^1]
等于arr[arr.Length-1]
友雳,最后一個(gè)元素 -
arr[^0]
等于arr[arr.Length]
稿湿,常與Range
組合使用
如果使用arr[^0]
的話就會(huì)拋出IndexOutOfRangeException
,arr[^0]
和arr[arr.Length]
是一個(gè)意思押赊。
這確實(shí)有點(diǎn)容易讓人混淆饺藤,但其實(shí)其它語(yǔ)言也差不多是這樣設(shè)計(jì)的,例如-1
這個(gè)索引表示最后一個(gè)元素流礁。
組合使用 Range 和 Index
完整拷貝數(shù)組的3種方式
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr01 = arr[0..arr.Length];
int[] arr02 = arr[0..^0];
int[] arr03 = arr[..];
注意:
- Range的范圍包含Start涕俗,不包含End。
- 所以索引為0的元素包含神帅,索引為10或者
^0
的元素不包含(盡管也不存在)再姑。
更多例子
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] arr01 = arr[..]; //完整的復(fù)制,數(shù)組
int[] allButFirst = arr[1..]; //不包含第一個(gè)元素的數(shù)組
int[] empty = arr[^0..]; //空數(shù)組
int[] onlyLastItem = arr[^1..]; //只包含最后一個(gè)元素的數(shù)組
int[] last4Items = arr[^4..]; //只包含最后四個(gè)元素的數(shù)組
int lastItem = arr[^1]; //最后一個(gè)元素
單獨(dú)使用Range或Index
int[] arr = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Index middle = 4;
Index threeFromEnd = ^3;
Range range = middle..threeFromEnd;
int[] mySlice = arr[range]; //5, 6, 7
參考
- C# 8 - Range 和 Index(范圍和索引):https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654076610&idx=1&sn=8e04e2da923f44d04c642a0e0aabd7aa找御,好文元镀,強(qiáng)烈推薦!霎桅!