现在的位置: 首页 > 综合 > 正文

C#数据结构和算法学习系列九—-String类和StringBuilder类

2012年09月28日 ⁄ 综合 ⁄ 共 4530字 ⁄ 字号 评论关闭

     字符串是字符的序列。它可以包含字母、数字和其他符号。在C#语言中把字符序列用一对闭合的双引号包围起来就可以产生文字串,如:“My name is xxx”。字符串可以由来自Unicode 字符集的任何字符组成。字符串也可以是没有字符而组成的。这种特殊的字符串被称为是空字符串。它的形式是由一对彼此相连的双引号构成的(“”)。请千万记住这不是表示空格的字符串。表示空格的字符串形式是“ ”。C#语言中的字符串具有精神分裂的天性——即字符串既是本地类型又是类的对象。实际上更准确的说法应该是可以把字符串作为本地数据值来使用,但是事实上每个产生的字符串都是String
类的一个对象。

A.String对象

1.创建String对象。

     创建String 的方式如下所示:string name = “Jennifer Ingram”;规则的变量,当然,也可以在两条分离的语句中先声明变量然后再进行赋值。声明的语法使得名字看上去就像一个规则的变量,但是实际上它是String 对象的一个实例。C#语言的字符串还允许在字符串中放置转义字符。转义字符用来把诸如换行符和制表符这类版式字符放置在字符串内。转义字符由一个反斜杠(\)开始,后边跟着单独一个表示版式的字母。例如,\n
说明换行,而\t 则表示一个制表符。在下面这行单独字符串中用到了这两种转义字符:
string name = “Mike McMillan\nInstructor, CIS\tRoom 306”;

2.String常用方法。

     虽然对字符串可以执行许多操作,但是一个小的操作集合却起着支配作用。三个最重要的操作分别是:1.找到字符串的子串indexof()。2.确定字符串的长度length()。3.截取字符串substring(),随后可以合并字符串。如下:

using System;
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();
     }
}

为了简化字符串的分解以及再次合并在一起的过程,String 类提供了两种可用的方法:用于分解字符串的Split 方法,以及用来把存储在数组中的数据制作成字符串的Join 方法。如下:

using System;
class Chapter7
{
     static void Main()
     {
          string data = "Mike,McMillan,3000 W. Scenic,North Little Rock,AR,72118";
          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.Write(joined);
     }
}

     在C#语言中有集中比较String 对象的方法。最显而易见的方法就是用在大多数情况下都可以工作正常的关系运算符。然而,在某些情况下其他一些比较的方法则会更加有效。例如,如果希望知道字符串是大于、小于、还是等于另外一个字符串,诸如此类的情况就需要用到String 类中找到的方法了。常用的比较方法有:equal(),compareTo(),compare()。

     另外两种在处理字符串时会很有用的比较方法是StartsWith 和EndsWith。这些实例方法都回取一个字符串作为参数,而且若实例是以字符串参数作为开始或结束那么方法都会返回True 值。如下:

using System;
using System.Collections;
class Chapter7
{
     static void Main()
     {
          string[] nouns = new string[] {" cat", "dog", "bird","eggs", "bones"};
          ArrayList pluralNouns = new ArrayList();
          foreach (string noun in nouns)
               if (noun.EndsWith(" s"))
                    pluralNouns.Add(noun);
          foreach (string noun in pluralNouns)
               Console.Write(noun + " ");
     }
}

    字符串处理通常包括对字符串的改变操作。我们需要在字符串中插入新的字符,从字符串中移除字符,用新字符替换旧字符,改变某些字符的情况,以及向字符串添加空格或者从字符串中移除空格,恰好为了命名某些操作。

(1).Insert()方法会把某个字符串插入到另外一个字符串的指定位置,返回新的字符串。

(2).Remove()方法采用了与插入名字相同的位置,而且通过获取名字变量的长度来计算出计数器的值。

(3).Replace()方法会取走两个参数:要移除掉的字符串和用来替换掉的字符串。此方方会返回新的字符串。

(4).Padleft()方法会对字符串进行右对齐排列。

(5).Padright()方法会对字符串进行左对齐排列。

(6).Concat 方法会取走String 对象的列表,把它们串联在一起,然后返回结果字符串。

(7).ToLower 方法和ToUpper 方法还可以把字符串从小写转换成大写形式。

(8).Trim 和TrimEnd 方法将会把空格或其他字符从字符串的任一端移除掉

B.StringBuilder对象

    StringBuilder 类提供了对多变的String 对象的存取。String 类的对象是不变的,这就意味着不能对他们进行改变。每次改变String 对象的值时,就会产生一个新的对象来保存数值。另一方面,StringBuilder 对象却是多变的。当对StringBuidler 对象进行改变时,正在改变的就是原始对象而不是对副本进行操作。

1.构造StringBuilder 对象

(1).StringBuilder sb= new StringBuilder();

(2).StringBuilder sb= nNew StringBuilder(25);

(3).StringBuilder sb= nNew StringBuilder(" Hello,world");

2.StringBuilder对象属性

(1).Length 属性指定了当前实例中字符的数量。

(2).Capacity 属性返回了实例的当前容量。

(3).MaxCapacity属性会返回对象当前实例中所允许的最大字符数量(尽管这个数量会随着对象添加更多的字符而自动增加)。

(4).Chars 属性既会返回在参数中指定位置上的字符,也会设置字符作为参数来传递。

3.修改StringBuilder 对象

     对StringBuilder 对象的修改包括在对象末尾处添加新的字符,在对象中插入字符,在含有不同字符的对象中替换一套字符,以及从对象中移除掉字符。通过使用Append 方法可以在StringBuilder 对象的末尾处添加字符。这种方法会取一个字符串值作为参数,并且把字符串串连到对象中当前值的末尾。如下:

using System;
Using System.Text;
class chapter7
{
     static void Main()
     {
          StringBuilder sb =As nNew StringBuilder();
          String[] words = new string[] {" now ", "is ", "the ", "time ", "for ", "all ",
"good ", "men ", "to ", "come ", "to ", "the ","aid ", "of ", "their ", "party"};
          for(int i = 0; i <= words.GetUpperBound(0); i++)
               sb.Append(words[indexi]);
          Console.WriteLine(sb);
     }
}

    还可以给StringBuilder 对象添加格式字符串。所谓格式字符串就是有格式说明嵌在内的字符串。可以如下所示这样在StringBuilder 对象内部替换格式数

using System;
using System.Text;
class chapter7
{
     static void Main()
     {
          StringBuilder sb = nNew StringBuilder();
          Console.WriteLine();
          sb.AppendFormat(" Your order is for {0000} widgets.", 234);
          sb.AppendFormat("\nWe have {0000} widgets left.", 12);
          Console.WriteLine(sb);
     }
}

4.StringBuilder对象常用方法

(1).Insert ()允许在当前StringBuilder 对象中插入字符串。此方法会取得三个参数。第一个参数说明了插入的开始位置。第二个参数则是要插入的字符串。而作为可选项的第三个参数则是一个整数,它用来说明打算在对象中插入字符串的次数。

(2).Replace() 方法替换StringBuilder 对象的字符。这种方法有两个参数:要替换的旧字符串和要放在替换位置上的新字符串。

(3).ToString()转换字符串,返回当前StringBuilder 实例的一个字符串实例。

 

    总结:String类与StringBuilder的性能比较。大家都知道String 对象是不可变的,而StringBuilder 对象则不是这样的。当然可以有理由相信StringBuilder 类是更加高效率的。但是,人们不是总会使用StringBuilder 类的,这是因为StringBuilder 类缺少几种能够合理有效进行字符串处理的方法。事实是在需要使用String
方法的时候可以把StringBuilder 对象转换成String 对象(稍后再转换回去)。但是需要知道何时要用StringBuilder 对象,以及何时只要继续用String 对象就可以了。对于相对较小的对象来说,String 对象和StringBuilder 对象之间真的没有什么差别。事实上,还可以争论对于达到1000 个字符的字符串而言使用String 类和使用StringBuilder 类效果是一样的。然而,当达到10000 个字符时,StringBuilder 类会有巨大的效率提升。尽管在1000
个字符和10000 个字符之间存在巨大的差异。

 

抱歉!评论已关闭.