c# string总结

简介: 1.string 是引用类型,其具有不可变性   我们一般认为的将内存分为五个区域。其中程序员常用的有三个,即栈、堆,静态存储区域。   其中值类型的值存储在栈中,如int类型,而引用类型的值存储在堆中。

1.string 是引用类型,其具有不可变性

  我们一般认为的将内存分为五个区域。其中程序员常用的有三个,即栈、堆,静态存储区域。

  其中值类型的值存储在栈中,如int类型,而引用类型的值存储在堆中。

  string类型具有不可变性,一旦其值发生了改变,就是一个新的对象。即每次对字符串进行操作时就会产生一个新的对象。

  等于null 和 等于""的区别:

       string = null; //不分配内存

       string = "";     //分配字节为0的内存

2.与stringbuilder的区别

如果操作少量的数据,我们可以使用string,如果有大量的字符拼接等操作,我们应使用stringbuilder,效率会提高很多。

StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量。

如:new StringBuilder("Hello World!", 25);

可以使用读/写 Capacity 属性来设置对象的最大长度。
MyStringBuilder.Capacity = 25;

 

3.常见使用方法

1. 比较字符串

比较字符串是指按照字典排序规则,判定两个字符的相对大小。按照字典规则,在一本英文字典中,出现在前面的单词小于出现在后面的单词。在String类中,常用的比较字符串的方法包括Compare、CompareTo、CompareOrdinal以及Equals,下面进行详细介绍。

Compare方法是String类的静态方法,用于全面比较两个字符串对象,包括6种重载方法。CompareTo方法将当前字符串对象与另一个对象做比较,其作用与Compare类似,返回值也相同。CompareTo与Compare相比,区别在于:CompareTo不是静态方法,可以通过一个String对象调用;CompareTo没有重载形式,只能按照大小写敏感方式比较两个整串。

Equals方法用于方便地判定两个字符串是否相同,有两种重载形式:

public boolEquals(string)

public static boolEquals(string,string)

如果两个字符串相等,Equals()返回值为True;否则,返回False。

String支持两个比较运算符“==”、“!=,分别用于判定两个字符是否相等和不等,并区分大小写。相对于上面介绍的方法,这两个运算符使用起来更加直观和方便。下例中,使用“==”、“!=”对“Hello”和“World”进行比较。

2. 定位字符串和子串

定位子串是指在一个字符串寻找其中包含的子串或者某个字符,在String类中,常用的定位子串和字符的方法包括StartWith/EndsWith、IndexOf/LastIndexOf以及IndexOfAny /LastIndexOf下面进行详细介绍。

StartWith/EndsWithStartWith方法

可以判定一个字符串对象是否以另一个子字符串开头,如果是返回True;否则返回False。其定义为:

Public bool StartsWith(string value) //其中,参数value即待判定的子字符串。

IndexOf/LastIndexOf

IndexOf方法用于搜索一个字符串,某个特定的字符或子串第一次出现的位置,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包含这个字符或子串,则返回-1。共有如下6种重载形式。

定位字符:

 

  1. intIndexOf(charvalue)
  2. intIndexOf(charvalue,intstartIndex)
  3. intIndexOf(charvalue,intstartIndex,intcount)

 

定位子串:

 

  1. intIndexOf(stringvalue)
  2. intIndexOf(stringvalue,intstartIndex)
  3. intIndexOf(stringvalue,intstartIndex,intcount)

 

在上述重载形式中,其参数含义如下:

Value:待定位的字符或者子串。

startIndex:在总串中开始搜索的起始位置。

Count:在总串中从起始位置开始搜索的字符数。

IndexOfAny/LastIndexOfAnyIndexOfAny方法

其功能同IndexOf类似,区别在于,可以搜索在一个字符串中,出现在一个字符数组中的任意字符第一次出现的位置。同样,该方法区分大小写,并从字符串的首字符开始以0计数。如果字符串中不包括这个字符或子串,则返回-1。IndexOfAny有3种重载形式:

 

  1. intIndexOfAny(char[] anyOf)
  2. intIndexOf(char[] anyOf,intstartIndex)
  3. intIndexOf(char[] anyOf,intstartIndex,intcount)

 

在上述重载形式中,参数含义如下:

anyOf:待定位的字符数组,方法将返回这个数组中任意一个字符第一次出现的位置。

startIndex:在总串中开始搜索的起始位置。

Count:在总串中从起始位置开始搜索的字符数。

3. 格式化字符串

Format方法用于创建格式化的字符串以及连接多个字符串对象。Foramt方法也有多个重载形式,最常用的为:

public static string Format(string format,params object[] args);

其中,参数format用于指定返回字符串的格式,而args为一系列变量参数。可以通过下面的实例来掌握其使用方法。

newStr="";

newStr=String.Format("{0},{1}!",strA,strB);

Console.WriteLine(newStr);//Hello,World!

在format参数中包含一些用大括号括起来的数字,如{0}、{1},这些数字分别一一对应于args参数数组中的变量。在生成结果字符串时,将使用这些变量代替{i}。需要说明的是,这些变量并不要求必须为String类型。在特定的应用中,Format方法非常方便。例如,想要输出一定格式的时间字符串,便可以使用Format方法,如下面代码所示。

newStr=String.Format("CurrentTime={0:yyyy-MM-dd}",System.DateTime.Now);

Console.WriteLine(newStr);//形如:2006-05-19

其中,格式字符串“yyyy-MM-dd”指定返回时间的格式形如“2006-05-19”,其定义参考System.Globalization.DateTimeFormatInfo类。

4. 连接字符串

Concat方法

Concat方法用于连接两个或多个字符串。Concat方法也有多个重载形式,最常用的为:public static string Concat(paramsstring[] values);其中,参数values用于指定所要连接的多个字符串,可以通过下面的实例来掌握其使用方法。

//ConcatnewStr="";

newStr=String.Concat(strA," ",strB);

Console.WriteLine(newStr);//“Hello World"

Join方法

Join方法利用一个字符数组和一个分隔符串构造新的字符串。常用于把多个字符串连接在一起,并用一个特殊的符号来分隔开。Join方法的常用形式为:public static string Join(stringseparator,string[] values);其中,参数value为指定的分隔符,而values用于指定所要连接的多个字符串数组,下例用“^^”分隔符把“Hello”和“World”连起来。

//Join

newStr="";

String[] strArr={strA,strB};

newStr=String.Join("^^",strArr);

Console.WriteLine(newStr);//"Hello^^World"

连接运算符“+”

String支持连接运算符“+”,可以方便地连接多个字符串,例如,下例把“Hello”和“World”连接起来。

newStr="";

newStr=strA+strB;

Console.WriteLine(newStr);//"HelloWorld"

5. 分隔字符串

使用前面介绍的Join方法,可以利用一个分隔符把多个字符串连接起来。反过来,使用Split方法可以把一个整串,执照某个分隔符,分裂成一系列小的字符串。例如,把整串,按照某个分隔符,分裂成一系列小的字符串。例如,把整串“Hello^^World”按照字符“^”进行分裂,可以得到3个小的字符串,即“Hello”、“”(空串)和“World”。

Split有多个重载形式,最常用的形式为:

public string[] Split(paramschar[] separator);

其中,参数separator数组包含分隔符。下例把“Hello^^World”进行分裂

//Split

newStr="Hello^^World";

char[] separator={'^'};

String[] splitStrings=new String[100];

splitStrings=newStr.Split(separator);

inti=0;

while(i<splitStrings.Length)

{

Console.WriteLine("item{0}:{1}",i,splitStrings[i]);

i++;

}

输出结果如下:Item0:Hello Item1:  Item2:World

6. 插入和填充字符串

String类包含了在一个字符串中插入新元素的方法,可以用Insert方法在任意插入任意字符。Insert方法用于在一个字符串的指定位置插入另一个字符串,从而构造一个新的串。Insert方法也有多个重载形式,最常用的为:

public string Insert(intstartIndex,stringvalue);

其中,参数startIndex用于指定所要插入的位置,从0开始索引;value指定所要插入的字符串。下例中,在“Hello”的字符“H”后面插入“World”,构造一个串“HWorldello”。

//Insert

newStr="";

newStr=strA.Insert(1,strB);

Console.WriteLine(newStr);//"HWorldello"

7. 删除和剪切字符串

Remove方法

Remove方法从一个字符串的指定位置开始,删除指定数量的字符。最常用的形式为:

public string Remove(intstartIndex,intcount);

其中,参数startIndex用于指定开始删除的位置,从0开始索引;count指定删除的字符数量。下例中,把“Hello”中的“ell”删掉。

//RemovenewStr="";newStr=strA.Remove(1,3);

Console.WriteLine(newStr);//"Ho"

Trim/TrimStart/TrimEnd

Trim方法

若想把一个字符串首尾处的一些特殊字符剪切掉,如去掉一个字符串首尾的空格等,可以使用String的Trim()方法。其形式如下:

public string Trim();

public string Trim(paramschar[] trimChars);

其中,参数trimChars数组包含了指定要去掉的字符,如果缺省,则删除空格符号。下例中,实现了对“@Hello#$”的净化,去掉首尾的特殊符号。

//Trim

newStr="";

char[] trimChars={'@','#','$',' '};

String strC="@Hello# $";

newStr=strC.Trim(trimChars);

Console.WriteLine(newStr);//"Hello"

另外,同Trim类似,TrimStart和TrimEnd分别剪切掉一个字符串开头和结尾处的特殊字符。

8. 复制字符串

String类包括了复制字符串方法Copy和CopyTo,可以完成对一个字符串及其一部分的复制操作。

Copy方法

若想把一个字符串复制到另一个字符数组中,可以使用String的静态方法Copy来实现,其形式为:public string Copy(stringstr);其中,参数str为需要复制的源字符串,方法返回目标字符串。

CopyTo方法

CopyTo方法可以实现Copy同样的功能,但功能更为丰富,可以复制字符串的一部分到一个字符数组中。另外,CopyTo不是静态方法,其形式为:

public void CopyTo(intsourceIndex,char[] destination,intdestinationIndex,intcount);

其中,参数sourceIndex为需要复制的字符起始位置,destination为目标字符数组,destinationIndex指定目标数组中的开始存放位置,而count指定要复制的字符个数。

下例中,把strA字符串“Hello”中的“ell”复制到newCharArr中,并在newCharArr中从第2个元素开始存放。

char[] newCharArr=new char[100];

strA.CopyTo(2,newCharArr,0,3);

Console.WriteLine(newCharArr);//"Hel"

9. 替换字符串

要替换一个字符串中的某些特定字符或者某个子串,可以使用Replace方法来实现,其形式为:

 public string Replace(char oldChar, char newChar);

 public string Replace(string oldValue, string newValue);

 其中,参数oldChar和oldValue为待替换的字符和子串,而newChar和newValue为替换后的新字符和新子串。下例把“Hello”通过替换变为“Hero”。

 //Replace

 newStr=strA.Replace("ll","r");

 Console.WriteLine(newStr);

10. 更改大小写

String提供了方便转换字符串中所有字符大小写的方法ToUpper和ToLower。这两个方法没有输入参数,使用也非常简单。下例首先把“Hello”转换为“HELLO”,然后再变为小写形式“hello”。

本节介绍了最常用的String类,并从比较、定位子串、格式化、连接、分裂、插入、删除、复制、大小写转换10个方面介绍了其方法。之所以称String对象为静态串,是因为一旦定义一个String对象,就是不可改变的。在使用其方法(如插入、删除操作)时,都要在内在中创建一个新的String对象,而不是在原对象的基础上进行修改,这就需要开辟新的内存空间。如果需要经常进行串修改操作,使用String类无疑是非常耗费资源的,这时需要使用StringBuilder类。

11. 包含转义字符使用”@”

如果要使用转义字符的话,需要在字符前加上”\”,而C#提供了一种新的机制,使用”@”.在”@”后的字符串都看作是原意,不会解释为转义字符串.并且以”@”开头的字符串支持回车换行的显示方式

12.删除某个相同的字符

string a="a,a,a,";

删除所以字符','

a.Replace(",", "");

删除最后一个字符

方法一(常用):
                    a = a.Substring(0, a.Length - 2);

方法二(推荐):
                    a = a.TrimEnd(',');

Trim()、TrimEnd()、TrimStart()的参数

13.计算某个相同字符的个数

 string str = "1,2,3,4,5,6";
方法一
int count = str.Count(ch => ch == ',');
方法二
Regex.Matches(str,@",").Count 
方法三
str.Split(',').Length-1
 
 
 
 
 参考:
http://www.cnblogs.com/hunternet/p/4712661.html
http://www.cnblogs.com/hackpig/archive/2010/02/15/1668357.html
http://blog.csdn.net/angelazy/article/details/8501776
 
相关文章
|
1月前
|
C#
51.c#:string类的静态方法
51.c#:string类的静态方法
20 1
|
29天前
|
C#
深入C#中的String类
深入C#中的String类
11 0
|
1月前
|
自然语言处理 C# 数据安全/隐私保护
50.c#:string类初始化
50.c#:string类初始化
12 1
|
1月前
|
开发框架 .NET C#
C# Dictionary<string, string> 对key做筛选
C# Dictionary<string, string> 对key做筛选
17 2
|
7月前
|
自然语言处理 C# 数据格式
C#OOP之十五 String类&StringBuilder类
C#OOP之十五 String类&StringBuilder类
22 0
|
4月前
|
C# 图形学
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
72 0
|
9月前
|
存储 安全 C#
C#中一些string方法
C#中一些string方法
60 0
|
4月前
|
Java C#
C# String与StringBuilder的区别和使用方法
C# String与StringBuilder的区别和使用方法
|
9月前
|
C# 索引
C#基础⑨——字符串(string str = null 与string str = ““的区别)
字符串数组变字符串(字符串数组变新的字符串数组)
|
安全 Java
String、StringBuffer、StringBuilder 区别总结
String、StringBuffer、StringBuilder 区别总结
104 0