数据结构 C#描述 第七章 第二部分

下面又是一个说明怎样排列数组中数据的问题:

 

using System;

 

public class Chapter7

{

    static void Main()

    {

        string[,] names = new string[,]

        {

            {"1054","Mary","Ella","Steve","Bob"},

            {"1133","John","Alex","David","Joe"},

            {"2624","Jole","Chris","Craig","Bill"}

        };

 

        Console.WriteLine();

        Console.WriteLine();

 

        for (int outer = 0; outer <= names.GetUpperBound(0); outer++)

        {

            for (int inner = 0; inner <= names.GetUpperBound(1); inner++)

            {

                Console.Write(names[outer, inner] + " ");

            }

            Console.WriteLine();

        }

        Console.WriteLine();

        Console.WriteLine();

 

        for (int outer = 0; outer <= names.GetUpperBound(0); outer++)

        {

            for (int inner = 0; inner <= names.GetUpperBound(1); inner++)

            {

                Console.Write(names[outer, inner].PadRight(10) + "   ");

            }

            Console.WriteLine();

 

        }

       

    }

 

}

 

 

     

 

 我们现在还看看字符串的拼接操作-Concat。这个方法要求传入一些字符串对象,然后返回拼接后的字符串。代码如下:

using System;

 

public class Chapter7

{

    static void Main()

    {

 

        string s1 = "hello";

        string s2 = "world";

        string s3 = "";

        s3 = String.Concat(s1, " ", s2);

        Console.WriteLine(s3);

       

    }

}

 

 

 

      我们还可以把字符从大写转换为小写,也可以进行小写转换大写的操作,这些就要用到ToLowerToUpper方法。代码片段如下:

     

using System;

 

public class Chapter7

{

    static void Main()

    {

 

        string s1 = "hello";

        s1 = s1.ToUpper();

        Console.WriteLine(s1);

        string s2 = "WORD";

        Console.WriteLine(s2.ToLower());

 

       

    }

}

 

 

 

 

      下面我们将用Trim方法和TrimEnd方法的讨论来介绍本小节。当我们与字符串打交道的时候,有时候在字符串的前面或者后面有多余的空格。Trim方法和TrimEnd会将字符串前后的空格删除。你还可以定义一个单个的字符或者数组,如果这个定义的字符或者数组在串中找到,就将之删除。代码如下:(注意:数组定义每项中的空格

using System;

 

public class Chapter7

{

    static void Main()

    {

        string[] names = new string[] { "David", "  Jim", "Mike  ", "Xiaoyan  " };

        Console.WriteLine();

        ShowNames(names);

        Console.WriteLine();

        TrimVals(names);

        Console.WriteLine();

        ShowNames(names);

 

    }

 

    static void ShowNames(string[] arr)

    {

        for (int i = 0; i <= arr.GetUpperBound(0); i++)

            Console.Write(arr[i]);

    }

 

    static void TrimVals(string[] arr)

    {

        char[] charArr = new char[] { ' ' };

        for (int i = 0; i <= arr.GetUpperBound(0); i++)

        {

            arr[i] = arr[i].Trim(charArr[0]);

            arr[i] = arr[i].TrimEnd(charArr[0]);

        }

    }

}

 

 

结果如下:

 

 

 

大家在调试这段代码的时候,可以分别将

 

arr[i] = arr[i].Trim(charArr[0]);

            arr[i] = arr[i].TrimEnd(charArr[0]);

      可以将这两句中的任意一句注释掉,然后比较TrimTrimEnd的效果!

 

首先注释上一句:结果显示如下:

 

 

 

 

 

      注释后一句:

 

 

 

 

 

      下面还有一个关于HTML注释的代码:

     

 

using System;

 

public class Chapter7

{

    static void Main()

    {

        string[] htmlComments = new string[]

        {

            "<--Start Page Number Functino-->",

            "<--Get user name and passward-->",

            "<--End Title page-->",

            "<--End Script-->"

 

        };

 

        char[] commentsChars = new char[] { '<', '!', '-', '>' };

 

        for (int i = 0; i <= htmlComments.GetUpperBound(0); i++)

        {

            htmlComments[i] = htmlComments[i].Trim(commentsChars);

            htmlComments[i] = htmlComments[i].TrimEnd(commentsChars);

        }

 

        for (int i = 0; i <= htmlComments.GetUpperBound(0); i++)

            Console.WriteLine("Comment: " + htmlComments[i]);

       

 

       

    }

}

 

 

显示如下:

 

 

 

 

StringBuilder

 

StringBuilder类支持可变的字符串对象。String对象是不可以改变的的,这就是说,一旦某个字符串被定义,以后它 就不再改变。你每次给那个已经定义了的字符串的操作,实际都没有改变它的值。你每次对它的操作都是在创建一个新的字符串对象,然后将操作后的值赋值给新的串,但是原来的串没有变。例如:

.string name=”xiaoyan”;

.string newName=name.ToLower();

当你输出name的值,发现name的值还是“xiaoyan”。

      从另一方面来说,StringBuilder对象是可以变的。当你对创建的StingBuilder对象改变时,你就真的改变了它。本节中我们将会讨论StringBuilder 在你程序中的用法。并且我们在结束本章的时候还会将StringBuilder类和Sting类做运行效率的比较

      StringBuilder在名称空间System.Text下,在你用它的时候,先要导入名称空间。

     

构造StringBuilder对象

 

      你可以用三种方式来构造一个StringBuilder .。首先,可以这样:

             StringBuilder stBuff=new StringBuilder();

 

      这个构造函数创建的stBuff对象的容量是16,即可以容纳16字符的串。这个容量是默认分配的,但是也可以自己定义初始的大小:

      StringBuilder stBuff2=new StringBuilder(25);

      这一行代码就申明了初始容量为25的对象。最后的一种方式如下:

      StringBuilder stBuff3=new StringBuilder(“Hello,Wolrd”);

 

这个对象的初始容量也是16.如果传入的参数的长度大于16,那么容量就会增至32。每次StringBuilder对象的容量不够时,就会自动的增加16

     

 

获取和设置StringBuilder对象

 

      StringBuilder 中有很多的属性可以用来获取StringBuilder的对象的信息。Length属性说明了一个StringBuilder对象实例中的字符的个数,而Capacity属性返回StringBuilder对象实例的现有的容量。MaxCapacity属性返回一个StringBuilder对象实例中最大允许装入的字符个数。

     

 

      下面的代码段就告诉我们怎样用这些属性:

      

        StringBuilder stBuff = new StringBuilder("Xiao yang");

        Console.WriteLine("The length of stBuff is: " + stBuff.Length);

        Console.WriteLine("Capacity of stBuff is: " + stBuff.Capacity);

        Console.WriteLine("MaxNum capacity of stBuff is: " + stBuff.MaxCapacity);

 

显示结果如下:

 

 当然,你还可以设置一个StringBuilder对象实例的长度:

stBuff.Length = 7;

        Console.WriteLine(stBuff);

 

 结果为”Xiao ya”

 

      为了保证StringBuilder对象的实例有一个符合天骄的最小的容量,你可以用EnsureCapacity方法,方法要传入一个整数:

      stBuff.EnsureCapacity(25);

 

      

 

 

 

修改 StringBuilder对象

      我们可以通过把字符串插入,,移除,替换或者在一个StringBuilder 对象的结尾拼接另外的串来改变现有的对象。

      你可以用Append方法来将一些字符连接到现有的StringBuilder对象实例的后面。这个方法要求传入一个字符串为参数。代码如下:

     

using System;

using System.Text;

 

public class Chapter7

{

    static void Main()

    {

        StringBuilder stBuff = new StringBuilder();

        string[] words=new string[]{

            "now"," is"," the" ," time"," for",

            " all" ," good"," man",

             " to"," come"," to",

             " see"," my"," blog"

        };

 

        for (int i = 0; i <= words.GetUpperBound(0); i++)

            stBuff.Append(words[i]);

        Console.WriteLine( stBuff);

       

    }

}

 

 

下一个要说的方法是Insert方法。这个方法可以使得我们将一个串插入到现有的StringBuilder对象中。这个方法要传入三个参数。第一个参数标明要插入的位置,第二个参数是你想插入的串,第三个参数是个可选项,标明你想把这个串插入多少次。

   代码如下:

  

using System;

using System.Text;

 

public class Chapter7

{

    static void Main()

    {

        StringBuilder stBuff = new StringBuilder();

        stBuff.Insert(0, "Hello");

        stBuff.Append("world");

        stBuff.Insert(5, " ");

        Console.WriteLine(stBuff);

 

 

 

       

    }

     

 

结果为Hello world

 

再看看下面的代码:

StringBuilder stBuff = New StringBuilder();

stBuff.Insert(0, "and on ", 6);

Console.WriteLine(stBuff);

结果为

and on and on and on and on and on and on

 

 

      StringBuilder类还有Remove方法,用来移除StringBuilder对象中的字符。这个方法要两个参数:起始位置,字符个数

StringBuilder stBuff = New StringBuilder("noise in

+++++string");

stBuff.Remove(9, 5);

Console.WriteLine(stBuff);

结果如下:

 

noise in string

 

      你还可以替换StringBuilder 对象中的一些字符,用 Repalce方法。方法要两个参数:被替换的字符,替换的新的字符。代码如下:

                     StringBuilder stBuff = New StringBuilder("recieve _

decieve reciept");

stBuff.Replace("cie", "cei")

 

 

      当我们与StringBuilder对象打交道的时候,可能要将StringBuilder对象转换为一个字符串,你可以用toString方法。这个方法把 StringBuilder对象的实例以一个字符串的形式返回。

      代码如下:

 

 

 

       using System;

using System.Text;

 

public class Chapter7

{

    static void Main()

    {

        StringBuilder stBuff = new StringBuilder("HELLO WORLD");

 

        Console.WriteLine(stBuff.ToString());   

 

        

    }

}

 

 

 

比较String StringBuilder

      比较两个对象用法很简单,关键是要记住,String类创建出的对象是不变,而StringBuilder的对象是可以变的。看个例子:

using System;

using System.Text;

 

public class Chapter7

{

    static void Main()

    {

        string astring = "";

        StringBuilder sb = new StringBuilder();

 

        for (int i = 0; i < 1000; i++)

        {

            astring += i;

            sb.Append(i);

        }

 

        Console.WriteLine(astring);

        Console.WriteLine(sb.ToString());

       

       

 

 

 

       

    }

}

 

 

 

 

分析就知道,用StringBuilder对象时,从头到尾只是用创建一个sb 的对象和1000个数字对象,而用string的那个,确创建了1000个字符的数字对象,1000个数字对象,可以想下,哪个的效率高?!

 

posted @ 2008-08-07 10:57  小洋(燕洋天)  阅读(847)  评论(0编辑  收藏  举报