字符与字符串
1 字符类Char的使用
1.1 Char类概述
Char类主要用来存储单个字符,占用16位(俩个字节)的内存空间。在定义字符型变量时,要以单引号标识。
char ch1 = 'L';
Char只定义一个Unicode字符。Unicode字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨语言、跨平台、的文本转换、处理的要求。
1.2 Char类的使用
Char类的常用方法及使用说明
方法 | 说明 |
---|---|
IsControl | 指示指定的Unicode字符是否属于控制字符类别 |
IsDigit | 指示某个Unicode字符是否属于十进制数字类别 |
IsHighSurrogate | 指示指定的Char对象是否为高代理项 |
IsLetter | 指示某个Unicode字符是否属于字母类别 |
IsLetterOrDight | 指示某个Unicode字符是属于字母类别还是属于十进制数字类别 |
IsLower | 指示某个Unicode字符是否小写字母类别 |
IsLowSurrogate | 指示指定的Char对象是否为低代理项 |
IsNumber | 指示某个Unicode字符是否属于数字类别 |
IsPunctuation | 指示某个Unicode字符是否属于标点符号类别 |
IsSeparator | 指示某个Unicode字符是否属于分割符类别 |
IsSurrogate | 指示某个Unicode字符是否属于代理项字符类别 |
IsSurrogatePair | 指示指定的Char对象是否形成代理项对 |
IsSymbol | 指示某个Unicode字符是否属于符号字符类别 |
IsUpper | 指示某个Unicode字符是否属于大写字母类别 |
IsWhiteSpace | 指示某个Unicode字符是否属于空白类别 |
Parse | 将指定字符串的值转换为它的等效Unicode字符 |
ToLower | 将Unicode字符的值转换为它的小写等效项 |
ToLowerInvariant | 使用固定区域性的大小写规则,将Unicode字符的值转换为其小写等销项 |
ToString | 将此实例的值转换为其等效的字符串表示 |
ToUpper | 将Unicode字符的值转换为它的大写等效项 |
ToUpperInvariant | 使用固定区域性的大小写规则,将Unicode字符的值转换为其大写等销项 |
TryParse | 将指定字符串的值转换为它的等效Unicode字符 |
Is开头的方法大多是判断是否为某个类别。
To开头的方法大多是转换为其他Unicode字符。
1.3 转义字符
转义字符是一种特殊的字符变量,其以反斜杠""开头,转义符\只针对后面紧跟着的字符进行操作。
转义符 | 说明 |
---|---|
\n | 回车换行 |
\t | 横向跳到下一制表位置 |
\’’ | 双引号 |
\b | 退格 |
\r | 回车 |
\f | 换页 |
\ | 反斜线符 |
\’ | 单引号 |
2 字符类String的使用
2.1 字符串的声明及赋值
在C#语言中,字符串必须包含在一对上双引号之内。
String str1 = null;
String str2;
String str3 = ""张三;
2.2 连接多个字符串
使用"+“运算符可以完成对多个字符串连接的功能。”+"运算符可以连接多个字符串并产生一个新的String对象。
C#中的依据相连字符串不予许分开在俩行中书写,因此可以使用"+"将一个字符串分为俩行连接起来。
String Name = "唐吉坷德" +
"多弗拉明戈";
2.3 比较字符串
2.3.1 "=="比较运算符
使用比较运算符比较俩个字符长的值是否相等,实现代码如下:
string str1 = "张三";
string str2 = "李四";
Console.WriteLine(str1==str2);
2.3.2 Compare方法
Compare方法用来比较俩个字符串是否相等,它有多个重载方法,其中最常见的俩种方法如下:
Int compare(string strA,string strB)
Int compare(string strA,string strB,bool ignorCase)
ignorCase为true则忽略大小写。Compare方法为静态方法,可以直接引用。返回值为0时标识俩字符串相同。例:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string str1 = "张三";
string str2 = "李四";
Console.WriteLine(String.Compare(str1, str2)); //1
Console.WriteLine(String.Compare(str1, str1)); //0
Console.WriteLine(String.Compare(str2, str1)); //-1
Console.ReadKey();
}
}
}
注意:
比较字符串并非比较字符串长度的大小,而是比较字符串在英文字典中的位置。比较字符串按照字典排序的规则,判断俩个字符串的大小。在英文字典中,前面的单词小于在后面的单词。
2.3.3 CompareTo方法
CompareTo方法与Compare方法相似,都可以比较俩个字符串是否相等,不同的是,CompareTo方法以实例对象本身与指定的字符串作比较。
public int CompareTo(string str1)
string str1 = "张三";
string str2 = "李四";
Console.WriteLine(str1.CompareTo(str2)); //1
Console.WriteLine(str1.CompareTo(str1)); //0
Console.WriteLine(str2.CompareTo(str1)); //-1
Console.ReadKey();
2.3.4 Equals方法
Equals方法主要用于比较俩个字符串是否相等,返回值为bool类型。
public bool Equals(string value)
public static bool Equals(string a,string b)
string str1 = "张三";
string str2 = "李四";
Console.WriteLine(str1.Equals(str1)); //True
Console.WriteLine(str1.Equals(str2)); //False
Console.WriteLine(Equals(str1,str2)); //False
Console.ReadKey();
2.4 格式化字符串
在C#中,String类提供了一个静态的Format方法,用于将字符串数据格式化成指定的格式,其语法如下:
Public static string Format(string format,object onj);
format : 用来指定字符串所需要格式化的形式
obj :要被个格式化的对象
用于日期时间的格式规范:
格式规范 | 日期格式 | 说明 |
---|---|---|
d | YYYY-MM-DD | 简短日期格式 |
D | YYYY年MM月DD日 | 完整日期格式 |
t | hh:mm | 简短时间格式 |
T | hh:mm:ss | 完整时间格式 |
f | YYYY年MM月DD日 hh:mm | 简短的日期/时间格式 |
F | YYYY年MM月DD日 hh:mm:ss | 完整的的日期/时间格式 |
g | YYYY-MM-DD hh:mm | 简短的可排序的日期/时间格式 |
G | YYYY-MM-DD hh:mm:ss | 完整的可排序的日期/时间格式 |
M或m | MM月DD日 | 月/日格式 |
Y或y | YYYY年MM月 | 年/月格式 |
例:
string str1 = "我的名字叫";
string str2 = "李四";
Console.WriteLine(string.Format("{0},{1}!!",str1,str2)); //我的名字叫李四
DateTime dt = DateTime.Now;
string strA = String.Format("{0:D}", dt);
Console.WriteLine(strA);
Console.ReadKey(); //2021年4月8日
2.5 截取字符串
String类提供了一个Substring方法,该方法可以截取字符串中指定位置和指定长度的子字符串,其语法格式如下:
public string Substring(int startIndex,int length)
startIndex:子字符串起始位置的索引
length:子字符串中的字符数
在使用Substring方法截取字符串时,如果length参数的长度大于截取字符串的长度,将从起始位置的所引出截取之后的所有字符,
例:
string str1 = "我的名字叫李四";
string str2 = str1.Substring(5,2);
Console.WriteLine(str2); //李四
Console.ReadKey();
2.6 分割字符串
string类提供了一个Spilt方法,用于分割字符串,此方法的返回值是包含所有分割字符串的数组对象,可以通过数组取得所有分割的字符串,其语法格式如下:
public string[] spilt(params char[] separator)
separator : 是一个数组,包含分隔符
string strA = "我!的@名#字$叫%李^四";
char[] separator = {'!','@','#','$','%','^' };
string[] spiltstrings = new string[10];
spiltstrings = strA.Split(separator);
for (int i = 0; i < spiltstrings.Length; i++)
{
Console.WriteLine("item{0}:{1}",i, spiltstrings[i]);
//item0: 我
//item1:的
//item2:名
//item3:字
//item4:叫
//item5:李
//item6:四
}
Console.ReadKey();
2.7 插入和填充字符串
2.7.1 插入字符串
string 类提供了一个Insert方法,用于向字符串的任意位置插入新元素,其与语法格式如下:
public string Insert (int startIndex,string value)
startIndex:用于指定索要插入的位置,索引从0开始
value:指定要插入的字符串
string strA = "唐李世民";
strA = strA.Insert(1,"太宗");
Console.WriteLine(strA); //唐太宗李世民
Console.ReadKey();
2.7.2 填充字符串
string类提供了PadLeft/PadRight方法用于填充字符串,PadLeft方法在字符串的左侧进行字符填充,PadRight方法在字符串的右侧进行字符填充,语法格式如下:
public string PadLeft(int totalWidth,char paddingChar)
public string PadRight(int totalWidth,char paddingChar)
totalWidth:指定填充后的字符串长度
paddingChar:指定所要填充的字符,如果省略则填充空格符号。
string strA = "*^__^*";
strA = strA.PadRight(7, ')');
strA = strA.PadLeft(8, '(');
Console.WriteLine(strA); //(*^__^*)
Console.ReadKey();
2.8 删除字符串
Sting类提供了Remove方法,用于从一个字符串中的指定位置,删除指定数量的字符,其语法格式如下:
Public string Remove(int startIndex);
Public string Remove(int startIndex,int count);
startIndex:用于指定开始删除的位置,索引从零开始
count:指定删除的字符数量
注意:参数count的值不能是0也不能是负数(startIndex也不能为负数),否则将会引发异常。如果为零则毫无意义。
string strA = "(*^__^*)";
strA = strA.Remove(7);
strA = strA.Remove(0, 1);
Console.WriteLine(strA); //*^__^*
Console.ReadKey();
2.9 复制字符串
String提供了Copy和CopyTo方法,用于将字符串或子字符串复制到另一个字符串或Char类型的数组中。
2.9.1 Copy方法
创建一个与指定的字符串具有相同值的字符串的新实例,其语法格式如下:
public static string Copy(string str)
str:是要复制的字符串
返回值:与string具有相同值的字符串
string strA = "(*^__^*)";
string strB = string.Copy(strA);
Console.WriteLine(strB); // (*^__^*)
Console.ReadKey();
2.9.1 CopyTo方法
CopyTo方法的功能与Copy方法基本相同,但是CopyTo方法可以将字符串中的某一部分复制到另一个数组中,其语法格式如下:
Public void CompTo(int sourceIndex,char[] destination,int destinationIndex,int count)
参数 | 说明 |
---|---|
sourceIndex | 需要复制的字符串的起始位置 |
destination | 目标字符数组 |
destinationIndex | 指定目标数组中的开始存放位置 |
count 指定要复制的字符个数
string strA = "*---(*^__^*)---";
char[] ch1 = new char[20];
strA.CopyTo(4,ch1,0,8);
Console.WriteLine(ch1); // (*^__^*)
Console.ReadKey();
2.10 替换字符串
String类提供了一个Replace方法,用于将字符串中的某个字符或字符串替换成其他的字符或字符串,其语法格式如下:
public string Replace(char 0Char,char NChar)
public string Replace(string 0value,string NValue)
参数|说明
0Char | 待替换的字符
NChar | 替换后的新字符
0value | 待替换的字符串
NValue | 替换后的新字符串
string strA = "*---(*^__^*)---";
string strB = strA.Replace("-","0");
string strC = strA.Replace("__", "____");
Console.WriteLine(strB); //*000(*^__ ^ *)000
Console.WriteLine(strC); //* ---(*^____ ^ *)-- -
Console.ReadKey();
3 可变字符串类
对于创建成功的字符串对象,它的长度是固定的,内容不能被改变和编译。虽然使用"+"可以达到附加新字符串的目的,但这样做会产生一个新的字符串实例,将极大的的增加系统开销。而C#中提供了一个可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率。
3.1 StringBuilder类的定义
public StringBuilder (string value,int cap)
value:StringBuilder对象引用的字符串
cap:设定StringBuilder对象的初始大小
StringBuilder MyStringBuilder = new StringBuilder("Hello Word!!");
3.2 StringBuilder类的使用
StringBuilder类存在于System.Txt命名空间中,使用时需要引用此命名空间。
StringBuilder类常用方法及说明:
方法 | 说明 |
---|---|
Append | 将文本或字符串追加到指定对象的末尾 |
AppendFormat | 自定义变量的格式并将这些值追加到StringBuilder对象的末尾 |
Insert | 将字符串或对象添加到当前StringBuilder对象中的指定位置 |
Remove | 从当前StringBuilder对象中移除指定数量的字符 |
Replace | 用另一个指定的字符来替换StringBuilder对象内的字符 |
StringBuilder strA = new StringBuilder("姓名") ;
strA = strA.Append("李四");
Console.WriteLine(strA); //姓名李四
int num = 1000;
strA = strA.AppendFormat("{0:C}",num);
Console.WriteLine(strA); //姓名李四¥1,000.00
strA = strA.Insert(2, "叫");
Console.WriteLine(strA); //姓名叫李四¥1,000.00
strA = strA.Remove(2, 1);
Console.WriteLine(strA); //姓名李四¥1,000.00
strA = strA.Replace("姓名", "Name is");
Console.WriteLine(strA); //Name is李四¥1,000.00
Console.ReadKey();
3.3 StringBuilder类与String类的区别
String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该对象分配新的空间。在需要对字符串进行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用StringBuilder类。
例:
class Program
{
[Obsolete]
static void Main(string[] args)
{
string strA = "";
long startTime = DateTime.Now.Millisecond;
for (int i = 0; i < 10000; i++)
{
strA += i;
}
long endTime = DateTime.Now.Millisecond;
Console.WriteLine("string消耗时间" + (endTime - startTime)); //string消耗时间48
StringBuilder sb1 = new StringBuilder("");
startTime = DateTime.Now.Millisecond;
for (int j = 0; j < 10000; j++)
{
sb1.Append(j);
}
endTime = DateTime.Now.Millisecond;
Console.WriteLine("strinbuilder消耗时间" + (endTime - startTime)); //strinbuilder消耗时间1
Console.ReadKey();
}
}