C# 3.这背后的逻辑是什么。。范围选择运算符?

C# 3.这背后的逻辑是什么。。范围选择运算符?,c#,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 data = new

我正在试图理解为什么。。操作员的工作方式,例如:

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 data = new []{0,1,2,3,4,5,6,7,8,9,10};
var test = data[0..10];
0到10表示它将选择11个项目(如果最后一个项目包含在内)。你必须从0开始,因为C索引是从零开始的,如果它们都是exlusive,你需要a-1来包含第一个

如报告中所述:

范围指定范围的起点和终点。范围是独占的,这意味着末端不包括在范围内。范围[0..^0]表示整个范围,正如[0..sequence.Length]表示整个范围一样

数据[^0..];语句的意思是,从0位置开始,带出它下面的任何内容。^运算符由于相同的原因反向工作^0不包括0

为什么不包括结束索引,而包括开始索引

这被称为半开放范围,在和中已经有关于这方面的问题。从本质上讲,这一方法的主要优势在于:

范围的长度正好是结束-开始。 在基于范围的算法中,不需要加/减1那么多 要在一个索引中将某个对象切成两半,可以使用相同的索引:x[…i]给出前半部分,x[i…]给出后半部分。i、 与i连接的e.x[…i]等于x本身。 如果一个范围的终点等于另一个范围的起点,则这两个范围彼此相邻,且没有重叠。 为什么数据[^0..]为空


这是^n表示长度-n,因此^0表示data.Length-0,这只是data.Length。数据[data.Length..]显然是空的。

如果没有包括最后一个索引,那么第一个索引也不应该包括在内-为什么?使用半闭区间并不少见。c以索引0而不是索引1开始数组。如果你知道在哪里查找,像这样的半开区间到处都是。我想说的是,开头和结尾都被排除在外的类型是最不常见的。
var data = new []{0,1,2,3,4,5,6,7,8,9,10};
var test = data[0..10];