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
的 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
我对索引范围运算符有点困惑:我希望表达式 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
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