首页 > 解决方案 > .. 范围选择运算符背后的逻辑是什么?

问题描述

我试图理解为什么 .. 运算符会以它的方式工作,例如:

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

我知道一定有它被设计成那样工作的原因,但我似乎无法弄清楚,那么这种行为的目的是什么?

谢谢你。

标签: c#

解决方案


为什么不包括结束索引,但开始索引是?

这被称为半开放范围,并且已经在PythonC++中提出了有关此问题的问题。从本质上讲,这样做的主要优点是:

  • 范围的长度正好是(结束 - 开始)。
  • 你不需要在基于范围的算法中加/减 1
  • 要在索引处将某物切成两半,您可以使用相同的索引:x[..i]给您前半部分,并x[i..]给您后半部分。ie x[..i]concatenate withi[i..]等于x自身。
  • 如果一个范围的结束等于另一个范围的开始,则这两个范围紧挨着彼此,并且没有重叠。

为什么是data[^0..]空的?

这是清楚地记录在案的。^n表示Length - n, 所以在这里^0表示data.Length - 0, 就是data.Length. data[data.Length..]显然是空的。


推荐阅读