Spiga

串(二):.NET Framework String类的应用

2012-04-15 23:27:20

字符串对大多数计算机程序而言是很普遍的,本篇文章将研究C#语言字符串的方法,分析如何使用String类,在后面的文章中还会介绍String类的具体实现。好了,我们先来看一下如果使用String类把。

一、String类常用的方法

虽然对字符串可以执行许多操作,但是只有几个操作是最常用到的,其中3个最常用方法分别是:找到字符串的字串(Substring);确定字符串长度(Length)和确定字符在字符串中的位置(IndexOf)。我们先看一段代码,用来实现将一串字符串语句中的单词分割到数组中(C#提供了一个Split方法可以实现该功能),來看看这几个常用方法的使用。

static void Main()
{
	string str = "now is the time for all good people";
	List<string> words = SplitWords(str);
	foreach (string word in words)
		Console.Write(word + " ");
	Console.ReadLine();
}

public static List<string> SplitWords(string str)
{
	string[] ws = new string[str.Length - 1];
	List<string> result = new List<string>();
	int pos;
	string word;
	pos = str.IndexOf(" ");
	while (pos > 0)
	{
		word = str.Substring(0, pos);
		result.Add(word);
		str = str.Substring(pos + 1, str.Length - (pos + 1));
		if (pos == 1)
		{
			word = str.Substring(0, str.Length);
			result.Add(word);
		}
		pos = str.IndexOf(" ");
	}
	return result;
}

除了IndexOf为C#还提供LastIndexOf方法。IndexOf是从左向右查,LastIndexOf是从右向左查,不管是IndexOf还是LastIndexOf,索引序列都是从左到右的(起始值是0)。
  初上面3个常有方法外,还有一个类方法也是非常常用的,它就是Format方法。该方法将指定的String中的格式项替换为指定的Object实例的值的文本等效项。我们来看看它的使用情况

stringstr1 =string.Format("{0:N1}",56789);                //result: 56,789.0
stringstr2 =string.Format("{0:N2}",56789);                //result: 56,789.00
stringstr3 =string.Format("{0:N3}",56789);                //result: 56,789.000
stringstr8 =string.Format("{0:F1}",56789);                //result: 56789.0
stringstr9 =string.Format("{0:F2}",56789);                //result: 56789.00
stringstr11 =(56789 / 100.0).ToString("#.##");            //result: 567.89
stringstr12 =(56789 / 100).ToString("#.##");              //result: 567

//C 或 c
//货币
Console.Write("{0:C}", 2.5);   //$2.50
Console.Write("{0:C}", -2.5); //($2.50)

//D 或 d
//十进制数
Console.Write("{0:D5}", 25);   //00025

//E 或 e
//科学型
Console.Write("{0:E}", 250000);   //2.500000E+005

//F 或 f
//固定点
Console.Write("{0:F2}", 25);   //25.00
Console.Write("{0:F0}", 25);   //25

//G 或 g
//常规
Console.Write("{0:G}", 2.5);   //2.5

//N 或 n
//数字
Console.Write("{0:N}", 2500000);   //2,500,000.00

//X 或 x
//十六进制
Console.Write("{0:X}", 250);   //FA
Console.Write("{0:X}", 0xffff);   //FFFF

二、Split方法和Join方法

Split方法会把一个字符串分解成一系列片段,并且把这个片段放入一个String数组内。此方法的实现集中在用来确定分解字符串的分解字符身上。事实上,分隔符就是此方法的第一个参数,该参数必须以char型数组的形式出现,而数组的第一个元素将是用作分隔符的字串。如下面代码:

string data = "now is the time for all good people";
char[] delimiter = new char[]{' '};
string[] strData = data.Split(delimiter);

Split方法有一个重要的重载方法,它会多出一个int类型的参数,该参数用来确定存储到数组内的元素的数量。例如,如果想把第一个串元素放置在数组的首位置,而把串的其余部分放在第二个元素内,就需要用到此重载方法。如下代码

string data = "now is the time for all good people";
char[] delimiter = new char[]{' '};
string[] arrData = data.Split(delimiter, 2);

返回的结果将不是长度为8的数组了,而是长度为2的数组。第一个数据项是now,其余部分为第二个数据项。

  Join方法将数组转换为字符串。此方法有两个参数:原始数组以及用来分割元素的字符。字符串是由跟着分隔符元素的数组元素组成构造出来的。还应该注意的是这种方法经常会被作为一种类方法来调用,这就意味着调用这个方法来自String类本身而不是来是String的实例。此方法的使用也非常简单,如下

string data = "now is the time for all good people";
char[] delimiter = new char[] { ' ' };
string[] arrData = data.Split(delimiter);

string newData = string.Join(" ", arrData);

三、字符串判断方法

Empty属性。string.Empty就相当于"",但它们和NULL是两码事。关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 string str2=null的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。另外在判断字符串为空的几种方法中s.Length==0优于 s==string.Empty优于s==""。

  IsNullOrEmpty属性。它指示指定的String对象是nullNothingnullptrnull引用,还是 Empty 字符串。不过String.IsNullOrEmpty(s)与s == null || s.Length == 0相比后则的速度要更快一些。

注:上面两个属性虽然它们都不是效率最好的,但是它们的语义是最好的。所以大部分情况下我们用这两个属性来做判断就可以了。

  Contains方法。判断参数值在指定的String对象是否出现。 那string.Contains(",")和string.IndexOf(",")!=-1比那个效率高。我们看下.net源代码中对Contains方法的实现就知道了

public bool Contains(string value)
{
	return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}

四、比较字符串方法

Equal方法。此方法会用一个String对象调用,并且会把另一个String对象取作它的参数。接着就会逐个字符地比较两个String对象。如果这两个String对象所包含的字符相同,那么方法就返回true,否则返回false。那Equal方法与==又有什么不一样呢?String.Equals()方法是String类从它的超类Object中继承的被用来检测两个对象是否相等,即两个对象的内容是否相等。==用于比较引用和比较基本数据类型时具有不同的功能①比较基本数据类型,如果两个值相同,则结果为true;②而在比较引用时,如果引用指向内存中的同一对象(即内存地址是一样的),结果为true。如下面的测试代码

//情况一
string s = "Test";
string t = string.Copy(s);
Console.WriteLine(s == t);                       //true 
Console.WriteLine((object)s == (object)t);       //false 

//情况二
string s = "Test";
string t = s;
Console.WriteLine(s == t);                       //true 
Console.WriteLine((object)s == (object)t);       //true 

//情况三
string s = "Test";
string t = string.Copy(s);  
Console.WriteLine(s.Equals(t));                  //true 
Console.WriteLine((object)s.Equals((object)t));  //true

//情况四
string s = "Test";
string t = s;
Console.WriteLine(s.Equals(t));                  //true
Console.WriteLine((object)s.Equals((object)t));  //true

  CompareTo方法。此方法也是取一个String作为参数,但是它的不会返回布尔值。而是返回1、0或者-1,如果调用方法才字符串比传入的字符传数字编码大将返回1,反之如果小就会返回-1,当然如果两个字符串相同就是返回0。但它并不是按字符串长度来比较的,而是比较两个字符串的第一个字符,相等则比较第二个,不相等则直接返回结果,依次往后比较。

  Compate方法。Compare方法通常会被作为一个类方法调用。此方法会执行和CompareTo方法相同的比较,这里就不举例了。

  StartsWith和EndsWith。这组实例方法都会取一个字符串作为参数,而且若实例是以字符串参数作为开头或结束的,那么就返回true,否则返回false。

五、处理字符串的方法

  Insert方法。此方法会把某个字符串插入到另一个字符串的指定位置。并返回新的字符串。

  Remove方法。这个方法会取两个整数参数,一个开始位置和一个计数器,其中计数器就是要删除字符的数量。

  Replace方法。这种方法会取两个参数,要移除掉的字符串和用来替换掉的字符串。此方法会返回新的字符串。

  PadLeft和PadRight方法。PadLeft方法会对字符串进行右对齐排列,PadRight方法会对字符串进行左对齐排列。

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

  ToLower和ToUpper方法。此组方法可以对字符串进行大小写转换。需要注意的是,在同时可以将字符串转换为大写也可以转换为小写来继续操作的时候,尽量选择ToUpper方法,C#对该方法进行了优化。

  Trim、TrimStart和TrimEnd方法。

  Copy和Clone方法。