第十五章:字符串
第十五章:字符串
本章目标
- 了解字符串的基本概念
- 掌握字符串常用的方法
- 字符串加强类StringBuilder
本章内容
1、什么是字符串?
概念:
字符串是用于表示文本的一系列字符。它可以是字符,单词 或 用双引号“引起来的长段落。
以下是字符串示例:
示例:字符串字面量
1
2
3
4"S"
"String"
"This is a string."
"大家好,我叫张三"声明字符串的方法:
有两种方法可以在C#中声明字符串变量。使用 System.String 类和 string 关键字。两者是相同的,没有区别。
【示例】:String 和 string
1
2
3string str1 = "Hello"; // 使用字符串关键字
String str2 = "Hello"; // 使用System.String类在C#中,字符串是字符的集合或数组。因此,可以使用char数组创建字符串,也可以像char数组一样访问字符串。
1
2
3
4
5
6
7
8
9char[] chars = {'H','e','l','l','o'};
string str1 = new string(chars);
String str2 = new String(chars);
foreach (char c in str1)
{
Console.WriteLine(c);
}
2、字符串的常用方法
方法 | 描述 |
---|---|
Clone() | 返回对此 String 实例的引用 |
Compare(String, String) | 比较两个指定的 String 对象,并返回一个指示二者在排序顺序中的相对位置的整数 |
CompareOrdinal(String, String) | 通过比较每个字符串中的字符,来比较两个字符串是否相等 |
CompareTo(String) | 将一个字符串与另一个字符串进行比较 |
Concat(String, String) | 连接两个指定的字符串 |
Contains(String) | 判断一个字符串中是否包含另一个字符串 |
Copy(String) | 将字符串的值复制一份,并赋值给另一个字符串 |
CopyTo(Int32, Char[], Int32, Int32) | 从字符串中复制指定数量的字符到一个字符数组中 |
EndsWith(String) | 用来判断字符串是否以指定的字符串结尾 |
Equals(String, String) | 判断两个字符串是否相等 |
Format(String, Object) | 将字符串格式化为指定的字符串表示形式 |
GetEnumerator() | 返回一个可以循环访问此字符串中的每个字符的对象 |
GetHashCode() | 返回该字符串的哈希代码 |
GetType() | 获取当前实例的类型 |
GetTypeCode() | 返回字符串的类型代码 |
IndexOf(String) | 返回字符在字符串中的首次出现的索引位置,索引从零开始 |
Insert(Int32, String) | 在字符串的指定位置插入另一个字符串,并返回新形成的字符串 |
Intern(String) | 返回指定字符串的内存地址 |
IsInterned(String) | 返回指定字符串的内存地址 |
IsNormalized() | 判断此字符串是否符合 Unicode 标准 |
IsNullOrEmpty(String) | 判断指定的字符串是否为空(null)或空字符串(””) |
IsNullOrWhiteSpace(String) | 判断指定的字符串是否为 null、空或仅由空白字符组成 |
Join(String, String[]) | 串联字符串数组中的所有元素,并将每个元素使用指定的分隔符分隔开 |
LastIndexOf(Char) | 获取某个字符在字符串中最后一次出现的位置 |
LastIndexOfAny(Char[]) | 获取一个或多个字符在字符串中最后一次出现的位置 |
Normalize() | 返回一个新字符串,新字符串与原字符串的值相等,但其二进制表示形式符合 Unicode 标准 |
PadLeft(Int32) | 返回一个指定长度的新字符串,新字符串通过在原字符串左侧填充空格来达到指定的长度,从而实现右对齐 |
PadRight(Int32) | 返回一个指定长度的新字符串,新字符串通过在原字符串右侧填充空格来达到指定的长度,从而实现左对齐 |
Remove(Int32) | 返回一个指定长度的新字符串,将字符串中超出长度以外的部分全部删除 |
Replace(String, String) | 使用指定字符替换字符串中的某个字符,并返回新形成的字符串 |
Split(Char[]) | 按照某个分隔符将一个字符串拆分成一个字符串数组 |
StartsWith(String) | 判断字符串是否使用指定的字符串开头 |
Substring(Int32) | 从指定的位置截取字符串 |
ToCharArray() | 将字符串中的字符复制到 Unicode 字符数组 |
ToLower() | 将字符串中的字母转换为小写的形式 |
ToLowerInvariant() | 使用固定区域性的大小写规则将字符串转换为小写的形式 |
ToString() | 将其它数据类型转换为字符串类型 |
ToUpper() | 将字符串中的字母转换为大写形式 |
Trim() | 删除字符串首尾的空白字符 |
TrimEnd(Char[]) | 删除字符串尾部的空白字符 |
TrimStart(Char[]) | 删除字符串首部的空白字符 |
下面通过一些示例来演示一下 String 类中方法的使用。
【示例】比较两个字符串是否相同:
1 | string str1 = "hello"; |
【示例】连接两个字符串:Concat(String, String)
1 | string str1 = "hello"; |
输出结果:
1 | hello C |
【示例】 判断一个字符串中是否包含零一个字符串 :Contains(String)
1 | string str1 = "hello C# "; |
输出结果:
1 | 包含 |
【示例】演示C#中的字符串常用方法
1 | string str1 = "hello C#"; |
输出结果:
1 | True |
综合案例:
输入邮箱地址,获取邮箱的用户名和后缀,例如:eagle_610@163.com,用户名:eagle_610,后缀:com
1
2
3
4
5
6
7
8
9
10
11
12
13
14Console.WriteLine("请输入邮箱:");
string inputEmail = Console.ReadLine();
//获取邮箱的用户名,则为@前面的字符串
//1.获取@的位置和.的位置
int index = inputEmail.IndexOf("@");
int index2=inputEmail.LastIndexOf(".");
//2.截取用户名
string userName = inputEmail.Substring(0, index);
string domainName=inputEmail.Substring(index2+1);
Console.WriteLine("用户名为:{0},后缀:{1}", userName,domainName);
Console.ReadKey();
3、StringBuilder类
为什么要使用stringBuilder?
string是一个不可变的字符串,每次对string类型进行运算(赋值或拼接)的时候其实相当于重新生成了一个新的string对象,然后指针指向了新的string对象,会对系统的性能产生影响,不适合大量、频繁字符串的拼接。
StringBuilder类
是string的改版类,改善了string类拼接性能问题,通过Append方法拼接字符串。
一般情况下看不出和string有和差异,但是如果对大量字符串进行添加操作,stringbuilder耗费的时间比string少的多。
StringBuilder的特点
1. 对象的容量有大小
可容纳的最大字符数是可以改变的,可以通过设置Capacity属性来改变。在没有达到容量前,它不会自动重新分配空间;当达到容量时,将自动分配新的空间且容量翻倍。
EnsureCapacity 方法可用来检查当前 StringBuilder 的容量。如果容量大于传递的值,则不进行任何更改;但是,如果容量小于传递的值,则会更改当前的容量以使其与传递的值匹配。
2. 保存的字符串的大小
所容纳的字符串的长度是Length属性,也可以查看或设置 Length 属性。如果将 Length 属性设置为大于 Capacity 属性的值,则自动将 Capacity 属性更改为与 Length 属性相同的值。如果将 Length 属性设置为小于当前 StringBuilder 对象内的字符串长度的值,则会缩短该字符串。
3. 可以使用ToString()将缓冲区数据转换为字符串
StringBuilder类的方法
创建StringBuilder对象
无参方式创建:
1
StringBuilder stringBuilder = new StringBuilder();
初始化字符串方式创建:
1
StringBuilder stringBuilder = new StringBuilder("hello");
创建时指定字符串长度方式创建:
1
2StringBuilder stringBuilder = new StringBuilder(10);
Console.WriteLine(stringBuilder.Capacity);//创建对象时内存分配的最大字符数据,一旦超过则累加创建
append()方法:拼接字符串
在加入新字符串时,不会在内存中新开辟字符串空间,只是给原有的字符串尾部加入新字符串
appendLine()方法:拼接后换行
AppendFormat()方法:格式化拼接字符串
1
2
3
4StringBuilder stringBuilder = new StringBuilder("hello");
stringBuilder.append(" C#");
Console.WriteLine(stringBuilder);//输出:hello C#insert()方法:向指定位置插入数据
1
2
3StringBuilder stringBuilder = new StringBuilder("hello c#");
stringBuilder.Insert(0, "hi ");//在0的位置插入hi
Console.WriteLine(stringBuilder);//输出:hi hello c#Remove()方法:移除指定范围的数据
1
2
3StringBuilder stringBuilder = new StringBuilder("hello c#");
stringBuilder.Remove(0,5);
Console.WriteLine(stringBuilder);Replace方法:替换指定的字符串
1
2
3StringBuilder stringBuilder = new StringBuilder("hello c#!");
stringBuilder.Replace("!", "?");
Console.WriteLine(stringBuilder);//输出:hello c#?
本章总结
课后作业
1.有一个姓名数组已经存储了10个姓名,请完成以下功能:
(1)查找姓”李”的人数量
(2)查找姓名中包含”杰”的人的数量
(3)查找姓名为三个及以上字数的人的数量
(4)将所有姓名中的”俊”替换为”帅”
(5)将所有姓名以”–”连接为一个新字符串后再输出
2.请输入一个姓名,然后截取其中”名”部分输出
3.请输入一个姓名,然后查找是否包含”志”,如果包含则输出其位置
4.请输入一个姓名,然后在其最前方插入”广创”,再输出。
5.请输入某人的英文名,然后转换为大写再输出。
6.请输入某人的姓名、性别、年龄,然后拼接起来再输出。
7.请输入一个姓名,然后转换成字符数组再输出。
8.请输入一个姓名,然后判断其长度是奇数还是偶数。
9.请输入一个姓名,然后输出其姓氏的哈希值。
10.输入一句英文短语,查找其中字母”b”的数量。