如何在 C# 8 中使用 Index 和 Range

如意真仙
• 阅读 1080

C# 8 中有几个比较好玩的新特性,比如下面的这两个:System.IndexSystem.Range,分别对应着索引和切片操作,这篇文章将会讨论这两个类的使用。

System.Index 和 System.Range 结构体

可以用它们在运行时对集合进行 indexslice,下面就是 System.Index 结构体的定义。


namespace System
{
    public readonly struct Index
    {
        public Index(int value, bool fromEnd);
    }
}

然后就是 System.Range 结构体的定义。


namespace System
{
    public readonly struct Range
    {
        public Range(System.Index start, System.Index end);
        public static Range StartAt(System.Index start);
        public static Range EndAt(System.Index end);
        public static Range All { get; }
    }
}

使用 System.Index 从尾部向前对集合进行索引

在 C# 8.0 之前没有任何方式可以从集合的尾部向前进行索引,现在你可以使用 ^ 操作符实现对集合的从后往前索引,如下代码所示:


System.Index operator ^(int fromEnd);

接下来用一个例子来理解该操作符的使用,考虑下面的string数组。


string[] cities = { "Kolkata", "Hyderabad", "Bangalore", "London", "Moscow", "London", "New York" };

接下来的代码片段展示了如何使用 ^ 运算符来获取 cities 集合的最后一个元素。


var city = cities[^1];
Console.WriteLine("The selected city is: " + city);

下面是完整的可供参考的代码:


        public static void Main(string[] args)
        {
            string[] cities = { "Kolkata", "Hyderabad", "Bangalore", "London", "Moscow", "London", "New York" };

            var city = cities[^1];
            Console.WriteLine("The selected city is: " + city);

            Console.ReadLine();
        }

如何在 C# 8 中使用 Index 和 Range

使用 System.Range 来提取子序列

你可以使用 System.Range 从 array 或者 span 类型上提取子集合,下面的代码展示了如何使用 range 和 index 来提取 string 的最后六个字符。


    class Program
    {
        public static void Main(string[] args)
        {
            string str = "Hello World!";
            Console.WriteLine(str[^6..]);

            Console.ReadLine();
        }
    }

如何在 C# 8 中使用 Index 和 Range

接下来是一个如何从 array 上提取子集合的例子。


        public static void Main(string[] args)
        {
            int[] integers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var slice = integers[1..5];

            foreach (int i in slice)
            {
                Console.WriteLine(i);
            }

            Console.ReadLine();
        }

如何在 C# 8 中使用 Index 和 Range

从图中可以看出,输出的数字为 1,2,3,4,即表示是一个 [) 的区间。

在 C#8 之前没有这样非常语义化的方式对集合进行 index 和 range,现在不一样了,你可以使用 ^.. 这两个语法糖,让你的代码更加干净,可读,易维护。

译文链接:https://www.infoworld.com/art...

更多高质量干货:参见我的 GitHub: csharptranslate

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
明月 明月
4年前
vue常见面试题
1.有使用过vue吗?说说你对vue的理解?2.说说你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?3.什么是双向绑定?原理是什么?4.请描述下你对vue生命周期的理解?在created和mounted这两个生命周期中请求数据有什么区别呢?5.Vue组件之间的通信方式都有哪些?6.vshow和vif有什么区别?使用场景分别是什
添砖java的啾 添砖java的啾
4年前
distinct效率更高还是group by效率更高?
目录00结论01distinct的使用02groupby的使用03distinct和groupby原理04推荐groupby的原因00结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下groupby和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于groupby。原因是di
Easter79 Easter79
4年前
str的用法
  字符串的索引切片以及常用的操作方法都是形成新的字符串,和原字符串没有关系 切片和索引\按照索引取值按照切片取值,顾头不顾尾,切片加步长 只要倒叙取值就要加上反向步长capitalize() 首字母大写\center() 将字符串居中可以添加填充物\swapcase() 大小写反转
Wesley13 Wesley13
4年前
TCP基础 —— 为什么建立连接需要三次握手,而断开连接则需要四次?能不能是三次?
一、TCP包概述一个segment包含header和data两个部分,对于这篇文章需要理解的就是,Sequencenumber和Acknowledgementnumber)这两个字段。TCP的可靠传输就是基于这两个字段来实现的。虽然文章的主旨是三次握手(threewayhandshake)与四次挥手(
Stella981 Stella981
4年前
ES6中的Promise和Generator详解
简介ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性。Promise什么是PromisePromise是异步编程的一种解决方案,比传统的解决方案“回调函数和事件”更合理和更强大。所谓P
Wesley13 Wesley13
4年前
MySQL ORDER BY主键id加LIMIT限制走错索引
背景及现象report\_product\_sales\_data表数据量2800万;经测试,在当前数据量情况下,orderby主键id,limit最大到49的时候可以用到索引report\_product\_sales\_data\_hq\_code\_orgz\_id\_index,大于49时就走PRIMARY主键索引。
Wesley13 Wesley13
4年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Wesley13 Wesley13
4年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Wesley13 Wesley13
4年前
Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
最近事情较多,好久没发文章了。前面关于Java并发的文章中主要介绍了并发的概念、思想、JavaSE5中java.util.concurrent包中的工具类的使用和实现源码的分析。这篇我们来简要了解一下JavaSE7中提供的一个新特性——ForkJoin框架。0\.处理器发展和需求背景回想一下并发开发的初衷,其实可以说是有两点
Stella981 Stella981
4年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型