====== 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);