C# 字符串

8.1 String 类基础

创建字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
// 字面量
string s1 = "Hello";

// 构造函数
string s2 = new string('A', 5); // "AAAAA"

// 从字符数组
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string s3 = new string(chars);

// 空字符串
string empty1 = "";
string empty2 = string.Empty;

字符串不可变性

1
2
3
4
5
6
string text = "Hello";
text.ToUpper(); // 返回新字符串,不修改原字符串

string upper = text.ToUpper();
Console.WriteLine(text); // "Hello"(不变)
Console.WriteLine(upper); // "HELLO"

8.2 常用方法

大小写转换

1
2
3
4
5
string text = "Hello World";

Console.WriteLine(text.ToUpper()); // HELLO WORLD
Console.WriteLine(text.ToLower()); // hello world
Console.WriteLine(text.ToLowerInvariant()); // 区域性无关

查找与判断

1
2
3
4
5
6
7
8
9
10
11
12
string text = "Hello World";

// 查找
Console.WriteLine(text.Contains("World")); // True
Console.WriteLine(text.StartsWith("Hello")); // True
Console.WriteLine(text.EndsWith("World")); // True
Console.WriteLine(text.IndexOf("World")); // 6
Console.WriteLine(text.LastIndexOf('l')); // 9

// 判断
Console.WriteLine(string.IsNullOrEmpty("")); // True
Console.WriteLine(string.IsNullOrWhiteSpace(" ")); // True

提取子串

1
2
3
4
5
6
7
8
9
10
11
12
string text = "Hello World";

// 子字符串
Console.WriteLine(text.Substring(6)); // "World"
Console.WriteLine(text.Substring(0, 5)); // "Hello"

// 截取
Console.WriteLine(text.Remove(5)); // "Hello"
Console.WriteLine(text.Remove(5, 6)); // "Hello"

// 替换
Console.WriteLine(text.Replace("World", "C#")); // "Hello C#"

8.3 分割与连接

Split 分割

1
2
3
4
5
6
7
8
9
10
11
12
string csv = "apple,banana,orange";
string[] fruits = csv.Split(',');
// ["apple", "banana", "orange"]

// 多个分隔符
string text = "one,two;three four";
string[] words = text.Split(',', ';', ' ');

// 移除空项
string data = "a,,b,,c";
string[] items = data.Split(',', StringSplitOptions.RemoveEmptyEntries);
// ["a", "b", "c"]

Join 连接

1
2
3
4
5
6
7
8
9
string[] fruits = { "apple", "banana", "orange" };

// 连接
string csv = string.Join(",", fruits);
// "apple,banana,orange"

// 带格式化
string result = string.Join(" - ", fruits);
// "apple - banana - orange"

8.4 字符串格式化

字符串插值(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string name = "Alice";
int age = 25;
double score = 95.5;

// 基本插值
Console.WriteLine($"姓名: {name}, 年龄: {age}");

// 格式化
Console.WriteLine($"分数: {score:F1}"); // 95.5
Console.WriteLine($"分数: {score:P0}"); // 9,550%
Console.WriteLine($"金额: {100:C}"); // ¥100.00

// 对齐
Console.WriteLine($"|{"左",-10}|{"右",10}|");
// |左 | 右|

// 表达式
Console.WriteLine($"明年年龄: {age + 1}");

string.Format

1
2
3
4
5
6
7
8
9
string name = "Bob";
int age = 30;

string message = string.Format("姓名: {0}, 年龄: {1}", name, age);
Console.WriteLine(message);

// 格式化
string formatted = string.Format("{0:C} - {1:P0}", 50, 0.75);
// ¥50.00 - 75%

8.5 StringBuilder

为什么需要 StringBuilder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 不推荐:字符串拼接产生大量临时对象
string result = "";
for (int i = 0; i < 1000; i++)
{
result += i.ToString(); // 每次创建新字符串
}

// 推荐:StringBuilder 高效拼接
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
sb.Append(i);
}
string result = sb.ToString();

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var sb = new StringBuilder();

// 追加
sb.Append("Hello");
sb.Append(" ");
sb.AppendLine("World"); // 追加并换行

// 插入
sb.Insert(5, "Beautiful "); // "Hello Beautiful World"

// 替换
sb.Replace("Beautiful", "Wonderful");

// 删除
sb.Remove(5, 10);

// 清空
sb.Clear();

// 转换为字符串
string result = sb.ToString();

初始化容量

1
2
3
// 预分配容量提高性能
var sb = new StringBuilder(1024);
sb.Append("..."); // 大量追加操作

8.6 字符串比较

比较方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string s1 = "Hello";
string s2 = "hello";

// == 运算符(区分大小写)
Console.WriteLine(s1 == s2); // False

// Equals 方法
Console.WriteLine(s1.Equals(s2)); // False

// 忽略大小写比较
Console.WriteLine(s1.Equals(s2, StringComparison.OrdinalIgnoreCase)); // True

// Compare 方法
Console.WriteLine(string.Compare(s1, s2)); // 1(s1 > s2)
Console.WriteLine(string.Compare(s1, s2, true)); // 0(相等)

排序比较

1
2
3
4
5
6
7
8
string[] words = { "banana", "Apple", "cherry" };

// 默认排序(区分大小写)
Array.Sort(words); // Apple, banana, cherry

// 忽略大小写排序
Array.Sort(words, StringComparer.OrdinalIgnoreCase);
// Apple, banana, cherry

8.7 字符串操作技巧

去除空白

1
2
3
4
5
6
7
8
9
string text = "  Hello World  ";

Console.WriteLine(text.Trim()); // "Hello World"
Console.WriteLine(text.TrimStart()); // "Hello World "
Console.WriteLine(text.TrimEnd()); // " Hello World"

// 去除指定字符
string chars = "***Hello***";
Console.WriteLine(chars.Trim('*')); // "Hello"

填充对齐

1
2
3
4
string num = "42";

Console.WriteLine(num.PadLeft(5, '0')); // "00042"
Console.WriteLine(num.PadRight(5, '-')); // "42---"

重复字符串

1
2
3
4
5
6
// .NET 6+
string line = new string('-', 20);
// "--------------------"

string repeated = string.Concat(Enumerable.Repeat("Ab", 3));
// "AbAbAb"

8.8 逐字字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
// 文件路径
string path = @"C:\Users\Alice\Documents";

// 多行字符串
string sql = @"
SELECT *
FROM Users
WHERE Age > 18
ORDER BY Name
";

// 包含引号
string quote = @"He said ""Hello""";

8.9 本章小结

  • 字符串是不可变的,修改会创建新字符串
  • 常用方法:ToUpperContainsSubstringReplace
  • Split 分割,Join 连接
  • 字符串插值 $"{var}" 是最推荐的格式化方式
  • 大量拼接使用 StringBuilder
  • 比较使用 StringComparison 指定规则
  • 逐字字符串 @"" 不转义

练习题

  1. 输入邮箱地址,验证是否包含 “@” 和 “.”
  2. 将句子中每个单词首字母大写
  3. 统计字符串中元音字母数量
  4. 以下代码输出什么?
    1
    2
    3
    string s = "Hello";
    s.ToUpper();
    Console.WriteLine(s);
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
C#基础教程 系列
第 8/20 篇
分享: