StringBuilder的C# String.Substring等价方法是什么?

41

StringBuilder似乎没有Substring(start, len)方法...我漏掉了什么?

3个回答

80

StringBuilder类有一个特殊版本的ToString方法,它接受两个参数,与Substring(startIndex, length)完全相同。

 StringBuilder sb = new StringBuilder("This is a Test");
 string test = sb.ToString(10, 4);
 Console.WriteLine(test);   // result = Test

如果您要从字符串中删除最后一个字符,可以访问 StringBuilder 的 Length 属性,这样您就不必像正常情况下使用 .Substring(0, sb.ToString().Length -1) - jspinella
最好直接在 StringBuilder 上操作,而不是将其转换为字符串,然后再创建一个少一个字符的新字符串。sb.Length--; - Steve
1
挺好的,更好的例子是传入非零的起始索引,这样可以过滤掉第一个最后一个字符。明确一下,我上面的例子是不应该这样做的。 - jspinella

1
这些都是获取所需子字符串的方法:
StringBuilder b = new StringBuilder();
b.Append("some text to test out!");
string s = b.ToString(0, 6);
//or ....
char[] letters = new char[6];
b.CopyTo(0, letters, 0, 6);
string s1 = new string(letters);
//or
string s2 = null;
for (int i = 0; i < 6; i++)
{
   s2 += b[i];
}

2
好的回答,但后者比一月份的糖浆还要慢。 - Steve
1
是的,没错,我只是想展示所有可用的选项 :) - terrybozzio

0

另一种方法是,如果您不想构建整个字符串(StringBuilder.ToString())并获取子字符串:

  public static StringBuilder SubString(this StringBuilder input, int index, int length)
{
    StringBuilder subString = new StringBuilder();
    if (index + length - 1 >= input.Length || index < 0) 
    {
        throw new ArgumentOutOfRangeException("Index out of range!"); 
    }
    int endIndex = index + length;
    for (int i = index; i < endIndex; i++)
    {
        subString.Append(input[i]);
    }
    return subString;
}

1
有趣的观点。也许你可以去掉循环,只需使用return new StringBuilder(input.ToString(index, length)); - Steve
@Steve - 是的,你说得对,我没有注意到 stringBuilder.ToString 还可以带参数 index 和 length。 - Naresh

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