当前位置: 移动技术网 > IT编程>开发语言>.net > 在C#及.NET框架中使用StringBuilder类操作字符串的技巧

在C#及.NET框架中使用StringBuilder类操作字符串的技巧

2017年12月12日  | 移动技术网IT编程  | 我要评论

熊家冢,仪玉,ilacee

但如果性能的优劣很重要,则应该总是使用 stringbuilder 类来串联字符串。下面的代码使用 stringbuilder 类的 append 方法来串联字符串,因此不会有 + 运算符的链接作用产生。

class stringbuildertest
{
  static void main()
  {
    string text = null;

    // use stringbuilder for concatenation in tight loops.
    system.text.stringbuilder sb = new system.text.stringbuilder();
    for (int i = 0; i < 100; i++)
    {
      sb.appendline(i.tostring());
    }
    system.console.writeline(sb.tostring());

    // keep the console window open in debug mode.
    system.console.writeline("press any key to exit.");
    system.console.readkey();
  }
}

输出:

0

1
2
3
4
...

在 .net framework 中使用 stringbuilder 类
string 对象是不可变的。每次使用 system.string 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 string 对象相关的系统开销可能会非常大。如果要修改字符串而不创建新的对象,则可以使用 system.text.stringbuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 stringbuilder 类可以提升性能。

实例化 stringbuilder 对象
通过用一个重载的构造函数方法初始化变量可以创建 stringbuilder 类的新实例,如下面的示例中所阐释的那样。

stringbuilder mystringbuilder = new stringbuilder("hello world!");

设置容量和长度
虽然 stringbuilder 是动态对象,允许扩充它所封装的字符串中的字符数,但您可以通过一个值来指定该对象可容纳的最大字符数。此值称为该对象的容量,不要将它与当前 stringbuilder 所容纳的字符串的长度相混淆。例如,可以使用长度为 5 的字符串“hello”创建 stringbuilder 类的一个新实例,同时可以指定该对象的最大容量为 25。当修改 stringbuilder 时,在达到容量之前,该对象不会为自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 stringbuilder 类的容量。下面的示例指定可以将 mystringbuilder 对象扩充到最大 25 个空白。

stringbuilder mystringbuilder = new stringbuilder("hello world!", 25); 

另外,可以使用读/写 capacity 属性来设置对象的最大长度。下面的示例使用 capacity 属性来定义对象的最大长度。

mystringbuilder.capacity = 25;

ensurecapacity 方法可用来检查当前 stringbuilder 的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。
也可以查看或设置 length 属性。如果将 length 属性设置为大于 capacity 属性的值,则自动将 capacity 属性更改为与 length 属性相同的值。如果将 length 属性设置为小于当前 stringbuilder 对象内的字符串长度的值,则会缩短该字符串。

修改 stringbuilder 字符串
下面列出了可以用来修改 stringbuilder 的内容的方法:
1.stringbuilder.append
将信息追加到当前 stringbuilder 的结尾。
2.stringbuilder.appendformat
用带格式文本替换字符串中传递的格式说明符。
3.stringbuilder.insert
将字符串或对象插入到当前 stringbuilder 对象的指定索引处。
4.stringbuilder.remove
从当前 stringbuilder 对象中移除指定数量的字符。
5.stringbuilder.replace
替换指定索引处的指定字符。

1.append
append 方法可用来将文本或对象的字符串表示形式添加到由当前 stringbuilder 对象表示的字符串的结尾处。下面的示例将一个 stringbuilder 对象初始化为“hello world”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。

stringbuilder mystringbuilder = new stringbuilder("hello world!");
mystringbuilder.append(" what a beautiful day.");
console.writeline(mystringbuilder);

输出:

hello world! what a beautiful day.

2.appendformat
stringbuilder.appendformat 方法将文本添加到 stringbuilder 对象的结尾处。该方法通过调用要设置格式的对象的 iformattable 实现来支持复合格式设置功能(有关更多信息,请参见复合格式设置)。因此,它接受数字、日期和时间以及枚举值的标准格式字符串、数字以及日期和时间值的自定义格式字符串,以及为自定义类型定义的格式字符串。(有关格式设置的信息,请参见.net framework 中的格式化类型。)可以使用此方法来自定义变量的格式并将这些值追加到 stringbuilder 的后面。下面的示例使用 appendformat 方法,将一个设置为货币值格式的整数值放到 stringbuilder 对象的末尾。

int myint = 25; 
stringbuilder mystringbuilder = new stringbuilder("your total is ");
mystringbuilder.appendformat("{0:c} ", myint);
console.writeline(mystringbuilder);

输出:

your total is $25.00  

3.insert
insert 方法将字符串或对象添加到当前 stringbuilder 对象中的指定位置。下面的示例使用此方法将一个单词插入到 stringbuilder 对象的第六个位置。

stringbuilder mystringbuilder = new stringbuilder("hello world!");
mystringbuilder.insert(6,"beautiful ");
console.writeline(mystringbuilder);

输出:

hello beautiful world!

4.移除
可以使用 remove 方法从当前 stringbuilder 对象中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。下面的示例使用 remove 方法缩短 stringbuilder 对象。

stringbuilder mystringbuilder = new stringbuilder("hello world!");
mystringbuilder.remove(5,7);
console.writeline(mystringbuilder);

输出:

hello

5.replace
使用 replace 方法可以用另一个指定的字符来替换 stringbuilder 对象内的字符。下面的示例使用 replace 方法在 stringbuilder 对象中搜索感叹号字符 (!) 的所有实例,并将其替换为问号字符 (?)。

stringbuilder mystringbuilder = new stringbuilder("hello world!");
mystringbuilder.replace('!', '?');
console.writeline(mystringbuilder);

输出:

hello world?

将 stringbuilder 对象转换为 string
必须先将 stringbuilder 对象转换为 string 对象,然后才能将 stringbuilder 对象表示的字符串传递给具有 string 参数的方法并在用户界面中显示它。可通过调用 stringbuilder.tostring 方法来执行此转换。下面的示例调用许多 stringbuilder 方法,然后调用 stringbuilder.tostring() 方法来显示字符串。

using system;
using system.text;

public class example
{
  public static void main()
  {
   stringbuilder sb = new stringbuilder();
   bool flag = true;
   string[] spellings = { "recieve", "receeve", "receive" };
   sb.appendformat("which of the following spellings is {0}:", flag);
   sb.appendline();
   for (int ctr = 0; ctr <= spellings.getupperbound(0); ctr++) {
     sb.appendformat("  {0}. {1}", ctr, spellings[ctr]);
     sb.appendline();
   }
   sb.appendline();
   console.writeline(sb.tostring());
  }
}

输出:

which of the following spellings is true:
0. recieve
1. receeve
2. receive

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网