数据结构 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);
}
}
我们还可以把字符从大写转换为小写,也可以进行小写转换大写的操作,这些就要用到ToLower和ToUpper方法。代码片段如下:
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]);
可以将这两句中的任意一句注释掉,然后比较Trim和TrimEnd的效果!
首先注释上一句:结果显示如下:
注释后一句:
下面还有一个关于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个数字对象,可以想下,哪个的效率高?!