引言
在日常的软件开发工作中,我们经常需要处理字符串、生成随机数以及操作日期时间等。本文将总结一些在C#中常见的字符串处理技巧、随机数生成方法以及日期时间的操作。
字符串处理
常用API
// 字符串中有很多的方法供我们使用,主要是用来处理字符串
1.Concat 2.Contains 3.IndexOf 4.LastIndexOf 5.IndexOfAny 6.Substring 7.Replace 8.CopyTo
9.StartsWith 10.EndsWith 11.Equals 12.Insert 13.string.IsNullOrEmpty 14.string.Join
15.Split 16.ToCharArray 17.Remove 18.ToUpper,ToLower 19.TrimStart,TrimEnd,Trim
20.PadLeft,PadRight 21.Format
1.拼接字符串(Concat)
string s1 = "abc", s2 = "123", s3 = "666";
string s4= string.Concat(s1, s2, s3);
Console.WriteLine(s5); // abc123666
2.判断字符串中,是否存在某些字符 区分大小写、相邻的字符位置要一样(Contains)
s5=“ abc123666”
bool b = s5.Contains("c1");
Console.WriteLine(b); // True
b = s5.Contains("ba");
Console.WriteLine(b); // False
b = s5.Contains("AB");
Console.WriteLine(b); // False
3.查询字符串中某个字符出现的位置(索引位置) 从前往后查询(IndexOf)//方法使用时,第一个字符从0开始
string s6 = "ABCabc123c";
int i = s6.IndexOf("a");
Console.WriteLine(i); // 3
Console.WriteLine(s6.IndexOf("bc")); // 4 拿到的是搜索到的第一个字符的索引位置
Console.WriteLine(s6.IndexOf("6")); // -1 如果搜索的字符串不存在,则返回-1
Console.WriteLine(s6.IndexOf("c")); // 5 如果要搜索的字符串出现多次,返回的是第一个的索引位置
Console.WriteLine(s6.IndexOf("b", StringComparison.OrdinalIgnoreCase)); // 1 默认情况下是区分大小写的。 如果想要忽略大小写
4.从后往前查询(LastIndexOf) //方法使用时,第一个字符从0开始
Console.WriteLine(s6.LastIndexOf("c")); // 9
Console.WriteLine(s6.LastIndexOf("c", 8)); // 5
Console.WriteLine(s6.IndexOf("c", 6)); // 9
5.查询字符串中第一次出现的指定字符数组中任意一个字符的位置,
查询字符是否为a c 中的 某一个, 如果是则返回对应的索引位置
(IndexOfAny) //方法使用时,第一个字符从0开始
Console.WriteLine(s6.IndexOfAny(new char[] { 'a', 'c' })); // 3
Console.WriteLine(s6.IndexOfAny(new char[] { 'a', 'c', 'A' })); // 0
// 从索引2开始往后查找
Console.WriteLine(s6.IndexOfAny(new char[] { 'a', 'c', 'A' }, 2)); // 3
// 从索引6开始往后查找3个字符
Console.WriteLine(s6.IndexOfAny(new char[] { 'a', 'c', 'A' }, 6, 3)); // -1 从索引6开始,开始带6自身
Console.WriteLine(s6.LastIndexOfAny(new char[] { 'a', 'c', 'A' })); // 9
6.截取字符串(Substring)//方法使用时,第一个字符从0开始
string s7 = "abcabcabc";
Console.WriteLine(s7.Substring(2)); // cabcabc 从索引为2的位置开始截取,带2自身一直截取到最后
Console.WriteLine(s7.Substring(2, 3)); // cab 从索引为2的位置开始截取,带2自身往后截取3个字符
7.替换(Replace)
string s8 = "唱跳rap打篮球";
string s9 = s8.Replace("打", "拍");
Console.WriteLine(s9); // 唱跳rap拍篮球
string s10 = s8.Replace("篮球", "乒乓球");
Console.WriteLine(s10); // 唱跳rap打乒乓球
string s11 = s9.Replace("篮球", "乒乓球");
Console.WriteLine(s11); // 唱跳rap拍乒乓球
===========================================================================================
8.复制 从字符串中复制一部分字符到一个字符数组中(CopyTo)//方法使用时,第一个字符从1开始
string s2 = "CBA123sadjsaijfiasjfilsdjflsjfls";
char[] chars = new char[10]; //10 代表新的字符串长度
// 参数1:从字符串中开始复制的位置
// 参数2:复制到哪个数组
// 参数3:从数组中哪个位置开始放
// 参数4:复制的长度
s2.CopyTo(1, chars, 2, 3);
for (int i = 0; i < chars.Length; i++)
{
// 2 B 3 A 4 1
Console.WriteLine($"{chars[i]}");
}
// char数组 转为字符串
string charsString = new string(chars);
Console.WriteLine("复制的结果是:" + charsString);
9.判断是否是以某些字符开头(StartsWith)
string name1 = "张三";
Console.WriteLine(name1.StartsWith("张")); // True
Console.WriteLine(name1.StartsWith("张三")); // True
string name2 = "老王王";
Console.WriteLine(name2.StartsWith("张")); // False
string name3 = "张三老王";
Console.WriteLine(name3.StartsWith("张三")); // True
10.判断是否是以某些字符结尾(EndsWith)
Console.WriteLine(name1.EndsWith("三")); // True
Console.WriteLine(name1.EndsWith("张三")); // True
Console.WriteLine(name2.EndsWith("老王")); // Flase
Console.WriteLine(name2.EndsWith("王")); // True
11.判断两个字符串是否相同 "123" == "123"(Equals)
Console.WriteLine(name1.Equals("张三")); // True
string name4 = "John";
Console.WriteLine(name4.Equals("John")); // True
Console.WriteLine(name4.Equals("john")); // False 区分大小写
Console.WriteLine(name4.Equals("john", StringComparison.OrdinalIgnoreCase)); // 不区分大小写 True
12.在指定的索引位置插入字符,生成新的字符串(Insert)//方法使用时,第一个字符从1开始
string s5 = "ABCabc123c";
string s6 = s5.Insert(2, "蔡徐坤");
Console.WriteLine(s6); // AB蔡徐坤Cabc123c
13.判断变量是否为null 或者 空字符串(string.IsNullOrEmpty)
string s7 = null;
Console.WriteLine(string.IsNullOrEmpty(s7)); // True
s7 = "";
Console.WriteLine(string.IsNullOrEmpty(s7)); // True
s7 = " ";
Console.WriteLine(string.IsNullOrEmpty(s7)); // False 中间不能有空格
14.将字符数组或者字符串数组 拼接成一个字符串(string.Join)
char[] cs = new char[] { 'a', 'b', 'c' };
Console.WriteLine(new string(cs)); // abc
//可以自定义连接符
string s8 = string.Join("", cs);
Console.WriteLine(s8); // abc
s8 = string.Join("-", cs);
Console.WriteLine(s8); // a-b-c
s8 = string.Join("1", cs);
Console.WriteLine(s8); // a1b1c
string[] ss = new string[] { "aa", "bb", "cc" };
s8 = string.Join("", ss);
Console.WriteLine(s8); // aabbcc
s8 = string.Join("~", ss);
Console.WriteLine(s8); // aa~bb~cc
15.使用指定的字符将字符串分割(Split)
string s11 = "张三,李四,王五,赵六,蔡徐坤,吴亦凡";
string[] s11s = s11.Split(','); // ["张三" , "李四", "王五", "赵六",“蔡徐坤”,"吴亦凡"]
for (int i = 0; i < s11s.Length; i++)
{
Console.WriteLine(s11s[i]);
}
16.将字符串转为字符数组(ToCharArray)
char[] chars1 = s11.ToCharArray(); // ['张', '三', ',', '李', '四' ...]
for (int i = 0; i < chars1.Length; i++)
{
Console.WriteLine(chars1[i]);
}
17.删除字符(Remove)//方法使用时,第一个字符从1开始
//s8=第14个里面的s8,也就是s8=aa~bb~cc
string s9 = s8.Remove(6);
Console.WriteLine(s9);// aa~bb~ 从指定位置(不带第6个字符本身) 删除后面所有的字符
s9 = s8.Remove(3, 2); //从第三个字符开始,往后面删除两个字符
Console.WriteLine(s9); // aa~~cc
18.大小写转换(转换大写:ToUpper,转换小写:ToLower)
string s12 = "aBabadBbSDFSFdas测试";
// 将小写全部转为大写
string s13 = s12.ToUpper();
Console.WriteLine(s13); // ABABADBBSDFSFDAS测试
// 将大写全部转为小写
s13 = s12.ToLower();
Console.WriteLine(s13); // ababadbbsdfsfdas测试
19.去除空格(去除前空格:TrimStart,后:TrimEnd,前后:Trim,全部:可以使用Replace方法替换,将空格转化为空)
string s14 = " 12 34 ";
// 去除前面空格
Console.WriteLine(s14.TrimStart());
// 去除后面空格
Console.Write(s14.TrimEnd());
// 前后都去除
Console.Write(s14.Trim());
Console.WriteLine("测试");
// 可以去除所有的空格
Console.WriteLine(s14.Replace(" ", ""));
20.填充空格(左填充:PadLeft,又填充:PadRight)
string s15 = "123";
//往字符串左边填充
string s16 = s15.PadLeft(8); // 5个空格 + "123"
Console.Write(s16);
Console.WriteLine("测试");
//往字符串右边填充
Console.Write(s15.PadRight(8));
Console.WriteLine("测试");
21.字符串格式化(Format)
string username = "蔡徐坤";
int age = 18;
char sex = '男';
Console.WriteLine("我的名字是{0},年龄是{1},性别是{2}", username, age, sex);
//Test("我的名字是{0},年龄是{1},性别是{2}", username, age, sex); //报错,不能这样用
string s17 = string.Format("我的名字是{0},年龄是{1},性别是{2}", username, age, sex);
Test(s17);
Console.WriteLine(string.Format("第0个:{0},666", "哈")); // 第0个:哈,666
// 4表示 此处至少占用4个字符的位置,如果插入的字符的个数不足占位的个数,会往前面填充空格
Console.WriteLine(string.Format("第0个:{0,4},666", "哈")); // 第0个: 哈,666
// 前面加上人民币符号 :Cn 以货币格式显示,并保留n位小数
Console.WriteLine(string.Format("我的存款:{0:C5}", 123456799.87654321)); // 我的存款:¥123,456,799.88
Console.WriteLine(string.Format("我的存款:{0:F2}", 123456799.87654321)); // 保留n位小数
static void Test(string s)
{
}
字符串构建器 (StringBuilder)
-
性能优势:
StringBuilder
是可变的,适用于频繁的字符串修改。- 相比于不可变的
String
类型,StringBuilder
在大量修改时能显著减少内存分配。
StringBuilder sb = new StringBuilder(50000);
for (int i = 0; i < 50000; i++)
{
sb.Append(i);
}
随机数生成
使用Random类
Random random = new Random(10);
Console.WriteLine(random.Next()); // 生成随机整数
Console.WriteLine(random.Next(2)); // 生成0或1
Console.WriteLine(random.Next(10, 15)); // 生成10到14之间的随机数
使用GUID
Console.WriteLine(Guid.NewGuid()); // 生成全局唯一标识符
使用MD5
// MD5用于生成消息摘要
// 不在本文中展开,但可以使用`System.Security.Cryptography`命名空间下的相关类
日期时间操作
获取当前时间
DateTime time = DateTime.Now;
Console.WriteLine(time); // 输出: 当前系统时间
- 获取年份:time.Year
- 获取月份:time.Month
- 获取日 :time.Day
- 获取小时:time.Hour
- 获取分钟:time.Minute
- 获取秒 :time.Second
- 获取毫秒:time.Millisecond
- 获取今天是今年的第几天:time.DayOfWeek
- 获取今天时星期几:time.DdayOfWeek 结果是0-6.
格式化时间
Console.WriteLine(time.ToString("yyyy-MM-dd HH:mm:ss")); // 输出: 2024-03-12 11:31:57
格式化时字母表示的含义:2023/10/27 14:30:28
- yy 23
- yyyy 2023
- M 10月27日
- MM 10
- MMM 10月
- MMMM 十月
- d 2023/10/27
- 今天是d号 今天是27号
- dd 27
- ddd 周一
- dddd 星期一
- h 12小时进制
- H 24小时进制
- hh 01 02 03 …… 11 12
- HH 01 02 03 …… 22 23 24
时间计算
DateTime targetDate = new DateTime(2026, 1, 1);
TimeSpan timeSpan = targetDate - DateTime.Now;
Console.WriteLine($"到2026年1月1日还有{timeSpan.Days}天");