第七章 字符串、String类和StringBuilder类
字符串对大多数计算机程序而言是很普骗的,像文字处理软件和网页应用程序这些程序类型都广泛采用了字符串,这使得处理这类应用程序的程序员在字符串处理的效率问题上需要花费额外的心思。
7.1 String类的应用
C#语言中的字符串具有精神分裂的天性,即字符串既是本地类型又是类的对象。实际上更准确的说法应该是可以把字符串作为本地数据值来使用,但是事实上每个产生的字符串都是String类的一个对象,稍后会说明原因。
7.1.1 创建String 的对象
7.1.2 常用的String 类的方法
虽然对字符串可以执行许多操作,但是只有几个操作时最常用的,其中三个最常用的操作分别是:找到字符串的子串;确定字符串的长度和确定字符在字符串中的位置。
class Chapter7
{
static void Main()
{
string string1 = "Hello world!";
int len = string1.Length;
int pos = string1.IndexOf(" ");
string firstWord, secondWord;
firstWord = string1.Substring(0, pos);
secondWord = string1.Substring(pos + 1, (len - 1) - (pos + 1));
Console.WriteLine("First word:" + firstWord);
Console.WriteLine("Second word:" + secondWord);
Console.Read();
}
}
虽然这段程序很有趣,但是它不是很实用。实际需要的程序该是可以从任意长度的符合格式短语中抽离出单词。我们可以用几种不同的算法来实现。
class Chapter7
{
static void Main()
{
string astring = "Now is the time for all good people s";
ArrayList words = new ArrayList();
words = SplitWords(astring);
foreach (string word in words)
Console.Write(word + " ");
Console.Read();
}
static ArrayList SplitWords(string astring)
{
//string[] ws = new string[astring.Length - 1];
ArrayList words = new ArrayList();
int pos;
string word;
pos = astring.IndexOf(" ");
while (pos > 0)
{
word = astring.Substring(0, pos);
words.Add(word);
astring = astring.Substring(pos + 1, astring.Length - (pos + 1));
pos = astring.IndexOf(" ");
if (pos ==-1)
{
word = astring.Substring(0, astring.Length);
words.Add(word);
}
}
return words;
}
}
7.1.3 Split 方法和Join 方法
string data = "Now,is,the,time";
string[] sdata;
char[] delimiter = new char[] { ',' };
sdata = data.Split(delimiter, data.Length);
foreach (string word in sdata)
Console.Write(word + " ");
string joined;
joined = String.Join(",", sdata);
Console.WriteLine();
Console.Write(joined);
7.1.4 比较字符串的方法
CompareTo, Compare,StartsWith,EndWith 方法
7.1.5 处理字符串的方法
Insert,Remove,Replace,PadLeft 和PadRight,ToLower和ToUpper,Trim 和TrimEnd方法
7.2 StringBuilder类
StringBuilder类提供了对多变的String对象的存取。String类的对象是不变的,这就意味着不能对他们进行改变。在System.text名字域中可以找到StringBuilder类
7.3 String类与StringBuilder的性能比较
String对象是不可变的,而StringBuilder对象则不是这样的。当然我们有理由相信StringBuilder类是更加高效的,但是,人们不是总会使用StringBuilder类的,这是因为StringBuilder类缺少几种能够合理有效进行字符串处理的方法。事实是需要使用String方法的时候可以把stringBuilder对象转换成String对象。
using System;
using System.Text;
using System.Diagnostics;
namespace _1
{
class Timing
{
TimeSpan duration;
public Timing()
{
duration = new TimeSpan(0);
}
public void stopTime()
{
duration = Process.GetCurrentProcess().TotalProcessorTime;
}
public void startTime()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
public TimeSpan Result()
{
return duration;
}
}
class Chapter7
{
static void Main()
{
int size = 100;
Timing timeSB = new Timing();
Timing timeST = new Timing();
Console.WriteLine();
for (int i = 0; i <= 3; i++)
{
timeSB.startTime();
BuildSB(size);
timeSB.stopTime();
timeST.startTime();
BuildString(size);
timeST.stopTime();
Console.WriteLine("Time(in milliseconds) to build StringBuilder" + "Object for" + size + "elements:" + timeSB.Result().TotalMilliseconds);
Console.WriteLine("Time(in milliseconds) to build String" + "Object for" + size + "elements:" + timeST.Result().TotalMilliseconds);
Console.WriteLine();
size *= 10;
}
}
static void BuildSB(int size)
{
StringBuilder sbObject = new StringBuilder();
for (int i = 0; i <= size; i++)
sbObject.Append("a");
}
static void BuildString(int size)
{
string stringObject = " ";
for (int i = 0; i <= size; i++)
stringObject += "a";
}
}
}