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();}

使用 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();}}

接下来是一个如何从 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();}

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

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

译文链接:https://www.infoworld.com/article/3532284/how-to-use-indices-and-ranges-in-csharp-80.html

如何在 C# 8 中使用 Index 和 Range相关推荐

  1. 如何在您HTML中嵌入视频和音频

    by Abhishek Jakhar 通过阿比舍克·贾卡(Abhishek Jakhar) 如何在您HTML中嵌入视频和音频 (How to embed video and audio in your ...

  2. 如何在React Native中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  3. (23/24) webpack实战技巧:如何在webpack环境中使用Json

    (23/24) webpack实战技巧:如何在webpack环境中使用Json 在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loa ...

  4. java如何读取下拉列表的值_java - 如何在Selenium 2中选择/获取下拉选项

    java - 如何在Selenium 2中选择/获取下拉选项 我正在将我的selenium 1代码转换为selenium 2,并且无法找到在下拉菜单中选择标签的任何简单方法或获取下拉列表的选定值. 你 ...

  5. 如何在ORACLE CLOUD中创建和访问容器集群丨内附官方文档链接

    墨墨导读:本文描述如何在Oracle Cloud中创建并访问容器服务.为了简单,所有的操作都是针对root隔离区. 创建允许容器运行的政策官方文档链接 这一步是必须的,否则可以增加容器容器. 官方文档 ...

  6. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

    Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...

  7. 如何在 React Native 中写一个自定义模块

    前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统.提到npm,一般指 ...

  8. vanilla_如何在Vanilla JavaScript中操作DOM

    vanilla by carlos da costa 通过卡洛斯·达·科斯塔 如何在Vanilla JavaScript中操作DOM (How to manipulate the DOM in Van ...

  9. asp.net应用程序_如何在ASP.NET中为聊天应用程序构建键入指示器

    asp.net应用程序 by Neo Ighodaro 由新Ighodaro 如何在ASP.NET中为聊天应用程序构建键入指示器 (How to build a typing indicator fo ...

最新文章

  1. 超过efficientnet
  2. MVC HtmlHelper用法大全
  3. mysql-增删改(DML)
  4. Linux配置最基础的命令
  5. VS2019 使用 C/C++ 动态链接库 并 进行调用
  6. 41. 后台模块开发(6)
  7. 一些自己使用VS2015的心得
  8. 中国将在大连建立下一个硅谷
  9. CoolFire系列讲座 第6讲
  10. JAVA开发工程师面试题shiro
  11. 《C陷阱与缺陷》学习笔记(1):这本书值得看吗?
  12. 华硕笔记本bios设置u盘启动
  13. 深入了解触摸事件的分发
  14. Java PDF生成方案介绍及问题汇总
  15. [转] vagrant学习笔记 - provision
  16. Android百度地图之位置定位和附近查找代码简单实现 (上)
  17. 五线谱编辑Demo(MFC)
  18. bzoj2754【SCOI2012】喵星球上的点名
  19. 放弃文华财经,自己编程实现期货程序化交易
  20. Linux下jar启停脚本

热门文章

  1. Boosting(提升方法)之GBDT
  2. Django模板语言中的自定义方法filter过滤器实现web网页的瀑布流
  3. Oracle服务器修改IP后
  4. h5 端图片上传-模拟多张上传
  5. 请说说接口和抽象类的区别?
  6. js最全的十种跨域解决方案
  7. 深入浅出Google Android这本书怎么样
  8. centos php7 apcu,centos php5.4 升级 php7
  9. 如何更改从Outlook发送的电子邮件中的“答复”地址
  10. SublimeText 自带格式化代码功能