====== C# 字符串处理 (String Processing) ======
在 C# 中,`string` 是一个引用类型,但它具有**不可变性 (Immutability)**。这意味着一旦创建了字符串对象,就不能修改它的值。所有看似修改字符串的方法(如 `Replace`, `Substring`)实际上都是返回了一个新的字符串对象。
===== 1. 基础属性与定义 =====
==== 1.1 定义与长度 ====
使用 `Length` 属性获取字符串中字符的个数。
// 定义字符串
string k = "scdmckl";
// 获取长度
int num = k.Length;
// num 的值为 7
==== 1.2 换行符 ====
在 Windows 系统中,标准的换行符是 `\r\n` (回车 + 换行)。
* **扩展知识**:为了跨平台兼容性,建议使用 `Environment.NewLine`。
string str = "第一行" + "\r\n" + "第二行";
// 或者
string str2 = "第一行" + Environment.NewLine + "第二行";
===== 2. 字符串截取 (Substring) =====
`Substring` 是最常用的字符串截取方法,它有两个主要的重载版本。
^ 方法 ^ 语法 ^ 说明 ^
| **截取指定长度** | `Substring(int startIndex, int length)` | 从 `startIndex` 开始,截取 `length` 个字符。 |
| **截取到末尾** | `Substring(int startIndex)` | 从 `startIndex` 开始,一直截取到字符串末尾。 |
==== 2.1 取字符串的前 n 个字符 ====
string str1 = "sacfvd";
// 从索引 0 开始,取 3 个字符
string str2 = str1.Substring(0, 3);
// 结果: "sac"
==== 2.2 去掉字符串的前 n 个字符 ====
这里有两种思路:使用 `Remove` 或者使用 `Substring`(取剩余部分)。
string str1 = "sacfvd";
// 方法 1: 使用 Remove(startIndex, count)
// 从索引 0 开始,移除 3 个字符
string res1 = str1.Remove(0, 3);
// 结果: "fvd"
// 方法 2: 使用 Substring(startIndex)
// 从索引 3 开始截取直到末尾(相当于跳过了前 3 个)
string res2 = str1.Substring(3);
// 结果: "fvd"
// ! 注意:原笔记中 str1.Substring(0, 3) 的结果是 "sac",并非去掉前 n 个,而是保留前 n 个。
==== 2.3 截取中间部分 (去头去尾) ====
场景:去除前 2 个字符,保留随后的 5 个字符。
string str1 = "mabcdefg";
// 从索引 2 ('b') 开始,截取 5 个字符
string str2 = str1.Substring(2, 5);
// 结果: "bcdef"
// WinForms 示例应用
// textBox8.Text = textBox7.Text.Substring(2, 5);
==== 2.4 截取最后一个字符 ====
利用 `Length` 属性计算最后一个字符的索引。
string str1 = "mabcd";
// 索引 = 总长度 - 1
string lastChar = str1.Substring(str1.Length - 1, 1);
// 结果: "d"
===== 3. 字符串修改与替换 =====
由于字符串的不可变性,必须将修改后的结果赋值给变量。
==== 3.1 替换内容 (Replace) ====
将字符串中指定的子串替换为新内容。
string str1 = "mabcd";
// 将 "abc" 替换为 "DEF"
string str2 = str1.Replace("abc", "DEF");
// 结果: "mDEFd"
===== 4. 字符访问与数组转换 =====
==== 4.1 读取单个字符 (索引器) ====
可以将字符串视为字符的只读数组,通过索引 `[]` 访问。
string text = "Hello";
// 获取索引为 1 的字符
char c = text[1];
// 结果: 'e' (注意类型是 char,不是 string)
// WinForms 示例应用
/*
string a = textBox12.Text;
int index = Convert.ToInt32(读取索引号.Text);
char b = a[index];
textBox13.Text = b.ToString(); // char 转 string 显示
*/
==== 4.2 字符串转字符数组 ====
如果需要修改字符串中的特定字符,通常先转为数组,修改后再转回字符串。
string str = "abcdef";
// 转换为 char 数组
char[] chars = str.ToCharArray();
// chars[0] = 'a', chars[1] = 'b'...
===== 5. 字符串分割 (Split) =====
`Split` 方法用于根据分隔符将字符串拆分为字符串数组。
==== 5.1 基础分割与去除空项 ====
场景:获取特定字符前的部分,或者分割数据。
string data = "value1,value2,,value3";
// 简单分割
string[] parts = data.Split(',');
// 高级分割:去除空条目 (StringSplitOptions.RemoveEmptyEntries)
// 示例:去除字符 'a' 前的一段(实际逻辑取决于数据结构,这里演示 Split 取第一项)
string input = "123a456";
string[] result = input.Split(new char[] { 'a' }, StringSplitOptions.RemoveEmptyEntries);
// 获取分割后的第一部分
string firstPart = result[0];
// 结果: "123"
===== 6. 字符串比较 =====
==== 6.1 判断相等 ====
比较两个字符串的内容是否相同。
string k = "sc";
string L = "sc";
// 方法 1: 使用 Equals 方法
bool isSame = k.Equals(L); // true
// 方法 2: 使用 == 运算符 (C# 中 string 重载了 ==)
bool isSame2 = (k == L); // true
// 扩展:忽略大小写比较
bool isSameIgnoreCase = k.Equals("SC", StringComparison.OrdinalIgnoreCase);