子字符串、字符串生成器和C#

7

我正在尝试:

1  string pal = "Juan     1David     1Correa";
2  StringBuilder sb = new StringBuilder(pal);
3  Console.writeline( sb.ToString(0,9) );
4  Console.writeline( sb.ToString(10,14) );
5  Console.writeline( sb.ToString(15,26) );

但是在第四行,它抛出了一个异常。
为什么?

抛出了什么异常?这也让我觉得使用 StringBuilder 很奇怪,你想要实现什么目的? - Matt Greer
9个回答

26
第二个参数指定了从 StringBuilder.ToString(int, int) 返回结果中获取的子字符串的长度,而不是它的结束索引。

从此实例检索子字符串。子字符串从指定字符位置开始,并且具有指定的长度。

例如,最后一句话应该改为:

Console.WriteLine(sb.ToString(15, 12));

另外,如果你仅需要从原始字符串中获取子字符串,你可以使用 String.Substring(int, int) 方法。


1
@Daniel G. R.:纠正您上次的陈述,如果您正在使用“Substring”,可以尝试“Console.WriteLine(sb.ToString().Substring(15));”。 - Neil Knight

3

第二个参数表示长度,因此应该为

Console.writeline( sb.ToString(10,5) );

实际上应该是5,以获取索引10、11、12、13和14处的字符。 - juharr

2

文档明确说明,当“startIndex和length的总和大于当前实例的长度”时,将抛出ArgumentOutOfRangeException异常。


1

第二个参数是长度而不是最后一个索引。所以在你的情况下,15+26=41超出了范围。


1

第二个参数是长度,而不是“结束字符”。它无法从第10个字符开始找到14个字符,因此出现错误。


1
当我运行这个程序时,异常会抛出在第5行,这是非常合理的,因为你的输入字符串中没有足够的字符来生成以15开头的26个字符。

0
首先,您应该告诉我们您收到的异常,而不是让我们猜测,然后我猜测您的字符串不超过24个字符...

0

StringBuilder.ToString 方法并不像你期望的那样工作。参数如下:

  1. startIndex:此实例中子字符串的起始位置。
  2. length:子字符串的长度。

因此,你从索引 15 开始尝试获取接下来的 26 个字符,这超出了字符串的长度。

文档可以在这里找到。


0
请仔细检查您的字符串是否包含空格字符而不是制表符。这是导致第4行出现异常的唯一原因。但即使您的字符串包含空格,由于26是子字符串的长度而不是最后一个字符的索引,因此您也将在第5行遇到异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接