美文网首页
C#8中的Range和Index(范围和索引)

C#8中的Range和Index(范围和索引)

作者: 落日流水 | 来源:发表于2021-08-08 17:47 被阅读0次

    来源:https://note.guoqianfan.com/2021/07/13/Range-and-Index-in-csharp

    Range-范围

    范围运算符

    • 范围运算符:..,它会生成一个Range对象。

    • 语法:{startIndex}..{endIndex}:包含startIndex不包含endIndex

    • 限制:0 <= startIndex <= endIndex <= arr.Length,其他均会报错!

      startIndex等于endIndex时,取不出元素,会生成一个空数组

    注意

    • 默认情况下,..的前面是0,后面是 arr.Length(不含)..等价于0..arr.Length
    • 所以..的前面和后面均可以为空
    • 所以..也可以单独使用,代表整个索引范围(0..arr.Length):arr[..]arr的完整拷贝。

    深拷贝还是浅拷贝需要看元素是值类型还是引用类型值类型复制值,可以认为是深拷贝引用类型复制引用,就是浅拷贝

    Range

    Range用来从集合中取出 指定索引范围 的元素来生成新的集合

    创建RangeRange 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这个序列,从索引为2的元素一直到索引为4(不含4)的元素提取出来组成新的序列。所以结果就是3,4。

    Index-索引

    Index用来指定索引。该索引可以用来从集合中取出指定索引处的元素,是单个元素

    乍一看,Indexint类型的索引没啥区别。嗯。。确实是这样,因为Index要与^操作符结合起来才能发挥更大的作用。对了,还有Range。。

    末尾运算符

    ^是末尾运算符(Hat运算符),它会生成一个Index对象,用来从末尾开始往前取数据。

    正向取数据时索引从0开始不同,^取数据时是从1开始的,代表倒数第一个元素

    • arr[^1]等于arr[arr.Length-1],最后一个元素
    • arr[^0]等于arr[arr.Length],常与Range组合使用

    如果使用arr[^0]的话就会抛出IndexOutOfRangeExceptionarr[^0]arr[arr.Length]是一个意思。

    这确实有点容易让人混淆,但其实其它语言也差不多是这样设计的,例如-1这个索引表示最后一个元素。

    组合使用 Range 和 Index

    完整拷贝数组的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[..]; //完整的复制,数组
    int[] allButFirst = arr[1..]; //不包含第一个元素的数组
    int[] empty = arr[^0..]; //空数组
    int[] onlyLastItem = arr[^1..]; //只包含最后一个元素的数组
    int[] last4Items = arr[^4..]; //只包含最后四个元素的数组
    int lastItem = arr[^1]; //最后一个元素
    

    单独使用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
    

    参考

    1. C# 8 - Range 和 Index(范围和索引):https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654076610&idx=1&sn=8e04e2da923f44d04c642a0e0aabd7aa,好文,强烈推荐!!

    相关文章

      网友评论

          本文标题:C#8中的Range和Index(范围和索引)

          本文链接:https://www.haomeiwen.com/subject/nzuovltx.html