C#从入门到精通(第四版)学习记录-- 第5章
第五章 字符与字符串
5.1 字符类Char的使用
5.1.1 Char类概述
- Char 类主要用来存储单个字符,占用16位(两个字节)的内存空间;
- Char 只定义一个Unicode字符;
5.1.2 Char类的使用
- 以 Is 开头的方法大多是判断Unicode字符是否为某个类别;
- 以 To 开头的方法主要是转换为其他Unicode字符;
char _cA = 'a';
Char.IsLetter(a); //判断a是否是字母
5.1.3 转义字符
- 转义字符是一种特殊的字符变量,其以反斜线“\”开头,后跟一个或多个字符;
- 转义字符具有特定的含义,不同于字符原有的意义,故称“转义”;
- 转义字符\只针对后面跟着的单个字符进行操作;
5.2 字符串类String的使用
5.2.1字符串的声明及赋值
- 声明字符串变量必须经过初始化才能使用,否则编译器会报出“使用了未赋值的变量”;
- 声明字符串之后,需要对其进行赋值,字符串的赋值使用 “=”
5.2.2连接多个字符串
- 使用“+”运算符可完成对多个字符串的连接功能,并产生一个String对象;
- C#中一句相连的字符串不能分开在两行中写,若要写,可以用“+”连接,加号放到换行处;
5.2.3 比较字符串
比较字符串可以使用以下方式:
- 使用“==”运算符 (比较的栈里面的值是否相等(值比较))
bool _bEque ="123" == "152";
- Equals函数(比较堆里面的值是否相等(引用地址值比较))属于String类,区分大小写,相同返回true,否则为false,两种形式使用:
string _str = "hdb";
bool _bResult = _ str.Equals("hf");
bool _bResult = String.Equals(_str,"hf");
- Compare方法,属于String类:
//值相等返回0,strA大于strB返回1,否则返回-1
Int Compare(string strA,string strB)
Int Compare(string strA, string strB, bool ignorCase)
//…(很多个重载Compare)
- ignorCase = true时,比较字符串时会忽略大小写的区别;Compare是静态方法,可以直接引用,如:
Int iResult = String.Compare("123","251");
- CompareTo方法,属于String类,但是以实例对象本身与指定的字符串比较
strA. CompareTo(strB)
//值相等返回0,strA大于strB返回1(字符串strA在字典中的位置比字符串strB的位置靠前),否则返回-1
5.2.4 格式化字符串
详细可参考博客: C#中string.format用法详解
- String类提供了一个静态的Format方法,把字符串数据格式化成指定的格式,语法格式:
Public static string Format(string format, object obj);
format: 用来指定字符串索要格式化的形式,用{}包起来,
obj: 要被格式化的对象;
以上是用于日期时间的格式规范
DateTime dt = DateTime.Now;
string str = String.Format("{0:G}",dt); //2022/12/07 09:29:10
string str1 = String.Format("{0}{1}", 1,"k"); //1k
5.2.5 截取字符
String类提供了一个Substring方法,可以截取字符串中指定位置和指定长度的子字符串,语法格式:
public string Substring(int startIndex,int length)
- startIndex: 子字符串的起始位置的索引
- length:子字符串中的字符数,若length大于截取字符串的长度,将从起始位置的索引处截取之后的所有字符;
string strA = “sdjskfskf”; string strB = “”; strB = StrA.Substring(0,4); // sdjsk - 在提取集合的“切片”时,首选使用范围操作符…(适用版本 C# 8.0+)推荐:var sub = strA [0…4];
5.2.6 分割字符串
String类提供了一个Split方法,可以分割字符串,返回包含所有分割字符串的数组对象,语法格式:
public string[] split(params char[] separator);
separator: 是一个数组,包含分隔符;
string _str = "123^fkf&kkk";
char[] separator = { '^', '&' };
string[] sArray = _str.Split(separator);
foreach (string i in sArray)
{
Console.WriteLine(i.ToString());
}
// 123
// fkf
// kkk
用^和&分割字符串,结果放到字符串数组中
5.2.7 插入和填充字符串
String类提供了一个Insert方法,可以在字符串中任意位置插入新的元素,语法格式:
public string Insert(int startIndex, string value)
- startIndex: 子字符串的起始位置的索引,从0开始
- value:要插入的字符串
string strA ="12345";
string strB = StrA.Substring(1,"hh"); // 1hh2345
5.2.8 删除字符串
String类提供了一个Remove方法,可以在字符串中指定位置删除指定数量的字符,语法格式:
public string Remove(int startIndex)
public string Remove(int startIndex, int count)
- startIndex: 用于指定开始删除的位置,索引从0开始
- count:要删除字符数量,必须大于0;若不写,默认上面格式,删除指定开始位置后的所有字符
string strA = "12345";
string strB = StrA. Remove(3); // 1234
5.2.9 复制字符串
String类提供了Copy和CopyTo方法,将字符串或字符串复制到另一个字符串或Char类型的数组中:
- Copy方法:创建一个与指定的字符串具有相同的字符串的新实例
public static string Copy(string str)
string strA = "sjfn";
string strB = String.Copy(strA);
- CopyTo方法:可以将字符串的某一部分复制到另一个数组中
public void CopyTo(int sourceIndex, char[] destination, int destinationIndex,int count)
sourceIndex, destinationIndex, count不能为负数
5.2.10替换字符串
String类提供了Replace方法,将字符串中的某个字符或字符串替换成其他的字符或字符串
public string Replace(char OChar,char NChar)
public string Replace(string OValue,string NValue)
string strA = "sjfn";
string strB = strA.Replace("fn","kkk"); //sjkkk
5.3 可变字符串类
- 字符串创建后长度就固定了,内容不能被修改了。虽然使用“+”可以达到附加新字符或字符串的目的,但会产生新实例,会在内存中创建新的字符串对象。
- 若重复对字符串修改会极大增加系统的开销,C#提供了StringBuilder类(可变字符串序列)(在命名空间System.Text中)提高频繁修改字符串的效率。
5.3.2 StringBuilder类的使用
int _iNum = 1000;
StringBuilder _sBString = new StringBuilder("123",100); //123
_sBString.Append("kkk"); //123kkk
_sBString.AppendFormat("{0:C}", _iNum); //123kkk¥1,000.00
_sBString.Insert(0,"UT:"); //UT:123kkk¥1,000.00
_sBString.Remove(5, _sBString.Length - 5); //UT:12 删除的长度不能超过现有的长度,否则会崩溃
_sBString.Replace("UT","SY"); //SY:12
Console.WriteLine(_sBString);
5.3.3 StringBuilder类与String类的区别
- String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该对象分配内存空间。频繁操作开销昂贵。
- 若要修改字符串而不是创建字符串,推荐使用StringBuilder类,如在循环中将许多字符串进行拼接时;
static void Main(string[] args)
{
nString str = "";
long startT = DateTime.Now.Millisecond;
for (int i = 0; i < 10000; ++i) { str = str + i; }
long endT = DateTime.Now.Millisecond;
Console.WriteLine("string拼接消耗时间:{0}s",endT-startT); //29s
StringBuilder builder = new StringBuilder("");
long builderStartT = DateTime.Now.Millisecond;
for (int j = 0; j < 10000; ++j) { builder.Append(j); }
long builderEndT = DateTime.Now.Millisecond;
Console.WriteLine("StringBuilder拼接消耗时间:{0}s", builderEndT - builderStartT); // 1s
Console.ReadLine();
}