c# - .. 范围选择运算符背后的逻辑是什么?
问题描述
我试图理解为什么 .. 运算符会以它的方式工作,例如:
var data = new []{0,1,2,3,4,5,6,7,8,9,10};
var test = data[1..4]; // This returns array with 1,2,3
从逻辑上讲,我会假设结果是 1,2,3,4 或 2,3(如果最后一个索引不包括,那么第一个索引也不应该)
或者
var test = data[0..]; // This returns array with 0,1,2,3,4,5,6,7,8,9,10 (zero at index 0 is also included)
var test = data[^0..]; // This returns array with nothing, where i would expect 10, since 10 is at index zero if we traverse the array backwards
我知道一定有它被设计成那样工作的原因,但我似乎无法弄清楚,那么这种行为的目的是什么?
谢谢你。
解决方案
为什么不包括结束索引,但开始索引是?
这被称为半开放范围,并且已经在Python和C++中提出了有关此问题的问题。从本质上讲,这样做的主要优点是:
- 范围的长度正好是(结束 - 开始)。
- 你不需要在基于范围的算法中加/减 1
- 要在索引处将某物切成两半,您可以使用相同的索引:
x[..i]
给您前半部分,并x[i..]
给您后半部分。iex[..i]
concatenate withi[i..]
等于x
自身。 - 如果一个范围的结束等于另一个范围的开始,则这两个范围紧挨着彼此,并且没有重叠。
为什么是
data[^0..]
空的?
这是清楚地记录在案的。^n
表示Length - n
, 所以在这里^0
表示data.Length - 0
, 就是data.Length
. data[data.Length..]
显然是空的。
推荐阅读
- bash - 连接连接字符串
- javascript - 对话流多个并行请求处理
- java - 我不知道如何一一制作代码构建块
- lamar - 如何使用 Lamar 为特定的“T”解析“ILogger”?
- ansible - Jinja2 表达式拆分、替换和连接
- c# - 更改 helix 工具包加载的 STL 模型的颜色(材质)。无法从 Model3DGroup 转换为 GeometryModel3D
- python - 使用腻子找不到目录火花
- delphi - VCL 中的 TEdit Interposer 类属性
- react-native - 使用信号器在连接构建时出错
- aws-lambda - 用于 URL 单击和浏览器用户代理的 AWS 自定义指标