C# String StringBuilder相关
C# string相关
字符串函数详解
在 C# 中,字符串是一种常用的数据类型,常常用于存储和处理文本数据。下面列举几个 C# 中字符串相关的常用操作函数:
- string.Length:获取字符串的长度,即字符数。例如,使用"hello world".Length可以获取字符串"hello world"的长度,返回值为11。
- string.Substring(int startIndex):获取字符串从指定位置开始的子字符串。第一个参数是子字符串的起始位置,如果省略该参数,则返回整个字符串。例如,使用"hello world".Substring(6)可以获取字符串"world"。
- string.Substring(int startIndex, int length):获取字符串中指定长度的子字符串。第一个参数是子字符串的起始位置,第二个参数是子字符串的长度。例如,使用"hello world".Substring(6, 5)可以获取字符串"world"。
- string.Contains(string value):检查字符串中是否包含指定的子字符串。第一个参数是要检查的子字符串,如果字符串包含该子字符串,则返回true,否则返回false。例如,使用"hello world".Contains("world")可以检查字符串"hello world"中是否包含子字符串"world",返回值为true。
- string.Replace(string oldValue, string newValue):将字符串中指定的子字符串替换为新的字符串。第一个参数是要替换的子字符串,第二个参数是替换后的新字符串。例如,使用"hello world".Replace("world", "universe")可以将字符串"hello world"中的子字符串"world"替换为"universe",返回值为"hello universe"。
- string.ToLower():将字符串转换为小写字母形式。例如,使用"Hello World".ToLower()可以将字符串"Hello World"转换为"hello world"。
- string.ToUpper():将字符串转换为大写字母形式。例如,使用"Hello World".ToUpper()可以将字符串"Hello World"转换为"HELLO WORLD"。
- string.Trim():去除字符串首尾的空格和其他空白字符。例如,使用" hello world ".Trim()可以将字符串" hello world "中的前后空格去除,返回值为"hello world"。
- string.Split(char[] separator):将字符串按照指定的分隔符拆分为多个子字符串。第一个参数是分隔符,可以是一个字符数组。例如,使用"hello,world".Split(new char[]{','})可以将字符串"hello,world"按照逗号分隔拆分为两个子字符串"hello"和"world"。
- string.Format(string format, object arg0, object arg1, ...):将格式字符串和指定的对象格式化为一个新字符串。第一个参数是格式字符串,后面的参数是要格式化的对象。例如,使用string.Format("My name is {0}, and I am {1} years old", "John", 25)可以将格式字符串中的{0}替换
string.Format
在 C# 中,可以使用 string.Format 方法对字符串进行格式化处理。
string.Format 方法的使用方法如下:
string.Format("格式化字符串", 参数1, 参数2, 参数3, ...);
其中,第一个参数是一个格式化字符串。在格式化字符串中,使用占位符 {} 来表示需要替换的内容,这些占位符可以与后面的参数一一对应,方法会将占位符 {} 替换为对应的参数值。例如,示例代码可以写成:
Console.WriteLine(string.Format("{0}{1}", "hello ", "c#"));
这里,"{0}{1}" 是格式化字符串,"hello " 和 "c#" 分别是参数1和参数2。
除了数字外,还可以使用一些特殊的格式,如日期时间、货币等,在格式化字符串中可以使用特定的格式标识符来实现。例如:
// 格式化时间
DateTime now = DateTime.Now;
string strTime = string.Format("现在是 {0:yyyy年MM月dd日 HH:mm:ss}", now);
Console.WriteLine(strTime);
// 格式化货币
double price = 128.5;
string strPrice = string.Format("价格是 {0:C}", price);
Console.WriteLine(strPrice);
输出结果为:
现在是 2022年03月07日 17:25:43
价格是 ¥128.50
这里,"{0:yyyy年MM月dd日 HH:mm:ss}" 是一个时间格式化字符串,表示将日期时间输出为 年-月-日 时:分:秒 格式的字符串。"{0:C}" 是一个货币格式化字符串,表示将数值输出为当前系统的货币单位格式(在这个示例中,是人民币 ¥)。
string.EndsWith
//判断⽂件扩展名:True
Console.WriteLine("Program.cs".EndsWith(".cs"));
EndsWith()是一个字符串(string)类方法,它用于判断一个字符串是否以另一个指定的字符串结尾。在这个例子中,".cs"字符串作为参数传递给EndsWith()方法,字符串"Program.cs"作为目标调用它。由于"Program.cs"字符串以".cs"结尾,因此该方法返回true,表示目标字符串符合我们的判断条件。
总而言之,EndsWith()方法可以帮助我们轻松判断一个字符串是否符合我们的特定格式要求。
string.Split
//切割
string str = "jack-lucy-lili-mark";
string[] names = str.Split('-');
Console.WriteLine(names[1]) ;
在给定的代码中,变量str包含一个字符串,其中使用连字符(-)作为"Jack"、"Lucy"、"Lili"和"Mark"这些名字之间的分隔符。
Split()方法被用来将这个字符串根据指定的分隔符字符拆分为一个子字符串数组。在这里,我们使用短划线符号'-'作为分隔符。
调用Split()方法的语法如下:
string[] names = str.Split(separator);
这个方法会根据分隔符将字符串拆分为一个子字符串数组,其中每个子字符串都是由分隔符字符分隔的。
在给定的代码中,names数组被分配为所得到的子字符串的元素。因此,names数组的每个元素都包含原始字符串str中的一个名字。
最后,Console.WriteLine(names[1])语句打印names数组中索引为1的元素,即"Lucy"。
string[] names在代码中可以被动态分配空间,也就是说不需要预先限定多少空间。
当我们使用Split方法将字符串str分割后,names数组的长度是动态分配的,它的长度取决于分割后的子字符串数量。因此,我们可以不用预先确定数组的大小。
在实际开发中,我们通常使用基于需求的方式来创建数组,并动态地调整数组的大小以容纳需要存储的元素。C# 提供了丰富的集合类和方法,使得动态分配数组和集合等数据结构变得容易。
下面是 C# 中常用字符串函数的底层实现和时间复杂度的简要介绍:
-
string.Length:获取字符串长度的操作的时间复杂度为 O(1)。
-
string.Substring(int startIndex):获取字符串子串的操作的时间复杂度为 O(n),其中 n 是子串的长度。
-
string.Substring(int startIndex, int length):获取字符串中指定长度的子串的操作的时间复杂度为 O(length)。
-
string.Contains(string value):检查字符串中是否包含指定子串的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.Replace(string oldValue, string newValue):将字符串中指定子串替换为新子串的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.ToLower():将字符串转换为小写字母形式的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.ToUpper():将字符串转换为大写字母形式的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.Trim():去除字符串首尾空格和其他空白字符的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.Split(char[] separator):将字符串按照指定的分隔符拆分为多个子串的操作的时间复杂度为 O(n),其中 n 是字符串的长度。
-
string.Format(string format, object arg0, object arg1, ...):将格式字符串和指定的对象格式化为新字符串的操作的时间复杂度与格式字符串和参数个数相关,通常为 O(n),其中 n 是字符串的长度。
需要注意的是,字符串函数的底层实现和时间复杂度可能受到许多因素的影响,例如字符串的长度、分隔符的数量等等。因此,在实际使用时,需要根据具体情况进行评估和优化。
StringBuilder
学习视频:【076-StringBuilder】 B站:IT萌叔Jack
string是⼀个特殊的引⽤类型,每次进⾏赋值或者拼接等都会分配新的内存空间,本质是底层采⽤char[]数组实现,⽽数组的⻓度⼀旦分配好后不可变。如果我们需要频繁的操作字符串,每次进行字符串拼接操作时,都会创建一个新的字符串对象,这会导致内存浪费和垃圾回收(GC)的开销。 因此C#给我们提供了StringBuilder类来操作字符串。需要注意的是使⽤该类需要引⼊命名空间:using System.Text
为了进一步优化内存和性能,建议在使用 StringBuilder 进行大量字符串操作时,设置其容量大小,以便在进行字符串操作时,避免重复重新分配内存空间的操作,并提高程序的执行效率。
public static void Main(string[] args)
{
#region 创建对象
// 创建⼀个空字符串""
StringBuilder sb01 = new StringBuilder();
// 创建⼀个有数据的字符串"jack"
StringBuilder sb02 = new StringBuilder("jack");
// 输出
Console.WriteLine(sb01);
Console.WriteLine(sb02);
Console.WriteLine(sb02.ToString());
#endregion
#region 容器容量
// 16
Console.WriteLine(sb01.Capacity);
sb01.Append("12345678");
sb01.Append("12345678");
sb01.Append("9");
// 32 每次扩容的原则是:原来的容量*2
Console.WriteLine(sb01.Capacity);
#endregion
#region 操作
//
StringBuilder sb03 = new StringBuilder();
// 追加: "jack-"
sb03.Append("jack-");
// 追加:"jack-lucy-"
sb03.Append("lucy-");
// 追加:"jack-lucy-peter-mark"
sb03.AppendFormat("{0}-{1}","peter","mark");
Console.WriteLine(sb03.ToString());
// 插⼊:"jack-json-lucy-peter-mark"
sb03.Insert(5,"json-");
Console.WriteLine(sb03);
// 删除:"jack-lucy-peter-mark"
sb03.Remove(5, 5);
Console.WriteLine(sb03);
// 查找:"jack-lucy-peter-mark"
Console.WriteLine(sb03[1]);
// 修改:"Jack-lucy-peter-mark"
sb03[0] = 'J';
Console.WriteLine(sb03.ToString());
// 替换:"Jack-lucy-peter-mark"
sb03.Replace('J','j');
Console.WriteLine(sb03);
// 内容:"jack-lucy-peter-mark"
Console.WriteLine(sb03.Length);
// 清空:”“
sb03.Clear();
Console.WriteLine(sb03);
Console.WriteLine(sb03.Length);
#endregion
}