C# 索引范围表达式的不正确结果

C# improper result of index range expression

我对索引范围运算符有点困惑:我希望表达式 myString[..0] 应该等于 myString[0..0],然后是 myString.Substring(0, 1)myString[0].ToString(),然后在以下代码案例:

string myString = " abc";
string resultString = myString[..0];

resultString 值应该是单个 space " "。不幸的是,我得到了 String.Empty :(

有谁知道为什么并且可以解释我,为什么我错了?

Microsoft 文档没有描述类似的情况(或者我找不到)。

the resultString value should be a single space " "

不,不应该。

范围的结尾 不包含 ,而不是 包含。因此,例如,x[0..x.Length] 将始终 return 整个字符串。

在你的例子中,你说的是“索引 0 之前的所有内容”,这显然是“空字符串”。

这在 Range.End 的文档中(除其他地方外)有记录:

Gets an Index that represents the exclusive end index of the range.

..System.Range 的语法和您正在使用的形式

string resultString = myString[..0];

翻译成,

string resultString = myString[Range.EndAt(new Index(0, fromEnd: true))] 

在您的情况下,您正在尝试 ..0,这意味着所有元素在第 0 个索引 之前 ,这就是您得到结果的原因 string.Empty

Index.End Property

的 MSDN 文档

Gets an Index that points beyond the last element.

可能更容易将范围内的索引视为字符之间, 指向一个字符

如果字符串中的字符被喷在fence面板上,那么一个范围内的索引指的是fenceposts,不是围栏板

当你用范围剪切一个字符串时,你会得到索引之间的所有字符。当您从 X 到 Y 连根拔起栅栏柱时,柱子之间的栅栏面板会掉落 - 您会在掉落的面板上看到字符

var hw = "Hello world";

hw[0..11]  //Hello world
hw[..5]    //Hello
hw[0..0]   //(empty string - there are no characters between index 0 and index 0)

我建议将范围内的索引视为字符之间的原因是它使使用“从右开始”索引器 ^n 更容易推理。选择 [^7..^2] 将选择这些面板:

..所以你得到 o wor

如果您将索引视为指向 字符 面板 则必须记住 a) "结尾范围的是排他性的”,然后 b) 在字符串的末尾添加了一个虚构的字符,即 ^0,这样您就可以再次排除它。或者你必须考虑“^x 索引来自右边,如果你使用它们,它会翻转独占”,然后 然后 你必须想出一些记忆或如果您将 non-^ 索引与 ^ 索引混合,则计算出哪个是唯一的结束。

总而言之,只要记住“索引在字符之间”和“^从右边开始”就可以保持一致,然后您可以随意混合搭配:

hw[^5..^1] //worl
hw[^5..10] //worl
hw[6..10]  //worl
hw[6..^1]  //worl