C# 字符串的定义和常用方法

栏目总目录


一、概念

首先了解下字符的定义:
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。字符是电子计算机或无线电通信中字母、数字、符号的统称,其是数据结构中最小的数据存取单位,通常由8个二进制位(一个字节)来表示一个字符。

字符是计算机中经常用到的二进制编码形式,也是计算机中最常用到的信息形式。根据计算机的编码方式不同,字符在不同编码方式的存储所占用字节数也不同。字符串,多个字符拼接物。


二、关键性质

不变性:
一般情况下,我们将“一经赋值,其值就不能被更改”视为不变性,字符串的不变性就是指,字符串一经赋值,其值就不能被更改,当通过代码使字符串变量等于一个新的值的时候,堆上会出现一个新的字符串,然后,栈上的变量指向新的字符串,无法更改原来字符串的值


三、String == null和""的区别

  • string str1 =""; 空字符串,定义一个string的引用并且分配内存空间
  • string str2 = null; 定义一个string的引用,只在栈上分配了空间,在堆上没有分配,直接使用该变量会报空引用错误

四、StringBuilder

要修改字符串而不是创建新的对象可用,StringBuilder可以自由扩展大小,String分配在栈区,StringBuilder分配在堆区

StringBuilder sb = new StringBuilder(长度);

当指定分配大小之后,性能就会得到提升。在达到容量之前,它不会为其自己重新分配空间。如果超过指定大小系统会当前大小倍增

五、常用方法

当然,以下是根据您提供的列表,重新排版并添加了C#语言示例的常用字符串处理方法。

一、Object 到 String

  1. ToString()

    object obj = null;
    try
    {
        string str = obj.ToString(); // 如果obj为null,这里会抛出NullReferenceException
    }
    catch (NullReferenceException ex)
    {
        Console.WriteLine("对象为空");
    }
    
  2. obj + “”

    string str = obj?.ToString() ?? ""; // 使用null条件运算符来安全地转换为字符串,如果为null则返回""
    

二、字符串拼接

  1. +

    string str1 = "Hello, ";
    string str2 = "World!";
    string str3 = str1 + str2; // 结果:"Hello, World!"
    
  2. string.Format()

    string str4 = string.Format("{0}, {1}", str1, str2); // 结果:"Hello, , World!"
    
  3. string.Concat()

    string str5 = string.Concat("11", "aa"); // 结果:"11aa"
    

三、判断字符串是否为""、null

  1. 直接比较

    if (str == "" || str == null)
    {
        Console.WriteLine("字符串为空或为null");
    }
    
  2. IsNullOrEmpty()

    if (string.IsNullOrEmpty(str))
    {
        Console.WriteLine("字符串为空或为null");
    }
    
  3. IsNullOrWhiteSpace()

    if (string.IsNullOrWhiteSpace(str))
    {
        Console.WriteLine("字符串为空、为null或仅包含空白字符");
    }
    

四、Substring(),截取字符串

  1. Substring(int startIndex)

    string substr = "Hello, World!".Substring(7); // 结果:"World!"
    
  2. Substring(int startIndex, int length)

    string substr2 = "Hello, World!".Substring(7, 5); // 结果:"World"
    

五、Replace(),替换字符串

  1. Replace(Char first, Char second)

    string replaced = "Hello, World!".Replace('l', 'L'); // 结果:"HeLLo, WorLd!"
    
  2. Replace(String firstString, String secondString)

    string replaced2 = "Hello, World!".Replace("World", "C#"); // 结果:"Hello, C#!"
    

六、Split(),字符串转成字符串数组

string[] words = "Hello, World!, C#!".Split(new char[] { ',', '!' }, StringSplitOptions.RemoveEmptyEntries);
// 结果:["Hello", " World", " C#"]

七、Join(),字符串数组转字符串

string result = string.Join(", ", words); // 结果:"Hello, World, C#"

八、ToLower() 、ToUpper(),大小写转换

  1. ToLower() 字符串转成小写

    string lower = "HELLO".ToLower(); // 结果:"hello"
    
  2. ToUpper() 字符串转成大写

    string upper = "hello".ToUpper(); // 结果:"HELLO"
    

九、Trim() 、TrimEnd() 、TrimStart()

  1. Trim() 从当前字符串的开头和结尾删除所有空白字符后剩余的字符串

    string trimmed = "   Hello, World!   ".Trim(); // 结果:"Hello, World!"
    
  2. TrimEnd() 去掉字符串末尾出现的字符或字符数组

    string trimmedEnd = "Hello, World!!!".TrimEnd('!'); // 结果:"Hello, World"
    
  3. TrimStart() 去掉头部出现的字符或字符数组

    string trimmedStart = "   Hello, World!".TrimStart(); // 结果:"Hello, World!"
    // 如果需要去除特定字符,如空格
    string trimmedSpacesStart = "   Hello, World!".TrimStart(' '); // 结果:"Hello, World!"
    

十、判断字符串是否包含指定字符串

  1. Contains() 字符串是否包含指定的字符串

    string str = "Hello, World!";
    bool containsHello = str.Contains("Hello"); // 结果:true
    bool containsCsharp = str.Contains("C#"); // 结果:false
    
  2. IndexOf() 返回指定字符串在字符串中的位置

    int indexHello = str.IndexOf("Hello"); // 结果:0
    int indexCsharp = str.IndexOf("C#"); // 结果:-1,表示未找到
    
  3. StartsWith() 字符串头部是否包含指定字符串

    bool startsWithHello = str.StartsWith("Hello"); // 结果:true
    bool startsWithWorld = str.StartsWith("World"); // 结果:false
    
  4. EndsWith() 字符串末尾是否包含指定字符串

    bool endsWithExclamation = str.EndsWith("!"); // 结果:true
    bool endsWithHello = str.EndsWith("Hello"); // 结果:false
    

十一、字符串比较

  1. Compare()

    string str1 = "apple";
    string str2 = "banana";
    int result = string.Compare(str1, str2); // 结果:< 0,因为"apple"在字典序上小于"banana"
    //按照字典排序比较,当str1 > str2时,返回1;当str1 = str2时,返回0;当str1 < str2时,返回 - 1
    if (result < 0)
    {
        Console.WriteLine(str1 + " comes before " + str2);
    }
    else if (result > 0)
    {
        Console.WriteLine(str1 + " comes after " + str2);
    }
    else
    {
        Console.WriteLine(str1 + " and " + str2 + " are the same");
    }
    
  2. Equals() 比较如果相等就返回true,否则返回false

    bool areEqual = str1.Equals(str2, StringComparison.Ordinal); // 结果:false
    bool areEqualIgnoreCase = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // 可以比较忽略大小写的版本
    

十二、字符串复制

string original = "abcdefg";
string copied = original.Substring(2, 4); // 从索引2开始,复制4个字符
// 结果:"cdef"

// 如果想要完全复制字符串,可以这样做:
string fullyCopied = original.Substring(0, original.Length);
// 结果:"abcdefg"

十三、字符串插入

使用StringBuilder

StringBuilder sb = new StringBuilder("abc");
sb.Insert(2, "12"); // 在索引2处插入"12"
string result = sb.ToString(); // 结果:"a12bc"

使用字符串连接(不是最高效的方法,特别是对于大量插入操作):

string s = "abc";
string result = s.Substring(0, 2) + "12" + s.Substring(2); // 结果:"a12bc"

五、字符串分解案列

需求:按照JSON文件对比机器命令id返回结果,把机器错误信息转义成中文,即数组里的数字,难点,数组里包含了个小数组,开头结尾不要
错误格式如:
0,{[[-2,3],[],[0],[],[],[21120],[21120]]},GetErrorID();
0,{[[85],[],[],[],[],[]]},GetErrorID();
但是没有错时,返回0,{[[],[],[],[],[],[]]},GetErrorID(); ,
会出现少掉前面那个数组,第一个数组为一类,其余为另一类

private string CauseShow(string id)
		{
			try
			{
				string[] s1 = id.Split(new char[] { '{', '}' }, StringSplitOptions.None);
				string[] s2 = s1[1].Split(new char[] { ',' }, StringSplitOptions.None);
				int Length = s2.Length;
				string controllerStr = null;
				string EndStr = null;
				if (Length == 6)
				{
					for (int i = Length - 1; i > Length - 6; i--)
					{
						if ((i == Length - 1 && s2[Length - 1].Length > 3) || (s2[i].Length > 2 && !(i == Length - 1)))
						{
							string[] s = s2[i].Split(new char[] { '[', ']' }, StringSplitOptions.None);
							string ss = null;
							for (int j = 0; j < alarm_servo.Length; j++)
							{
								if (Convert.ToInt32(s[1].ToString()) == alarm_servo[j].id)
								{
									ss = alarm_servo[j].Zh_CN.description;
								}
							}
							s2[i] = ss;
						}


						if (s2[i].Length == 2 || (s2[i].Length == 3 && i == Length - 1))
						{
							s2[i] = "";
						}
						if (i <= 0)
						{
							break;
						}
					}
					string[] s3 = s1[1].Split(new char[] { ',', '[', ']' }, StringSplitOptions.None);
					ArrayList s3List = new ArrayList();
					for (int i = 2; i < s3.Length - 2; i++)
					{
						if (s3[i] != "")
						{
							s3List.Add(s3[i]);
						}
						else
						{
							break;
						}
					}
					if (s3List.Count > 0)
					{
						for (int i = 0; i < s3List.Count; i++)
						{
							for (int j = 0; j < alarm_controller.Length; j++)
							{
								if (Convert.ToInt32(s3List[i].ToString()) == alarm_controller[j].id)
								{

									controllerStr += alarm_controller[j].Zh_CN.description;
									if (!(i == s3List.Count - 1))
									{
										controllerStr += ",";
									}
								}

							}
						}
					}

					for (int i = Length - 1; i > Length - 5; i--)
					{
						if (s2[i] == "")
						{
							continue;
						}
						else
						{
							EndStr += s2[i] + ",";
						}
					}
				}
				else
				{
					for (int i = Length - 1; i > Length - 6; i--)
					{

						if ((i == Length - 1 && s2[Length - 1].Length > 3) || (s2[i].Length > 2 && !(i == Length - 1)))
						{
							string[] s = s2[i].Split(new char[] { '[', ']' }, StringSplitOptions.None);
							string ss = null;
							for (int j = 0; j < alarm_servo.Length; j++)
							{
								if (Convert.ToInt32(s[1].ToString()) == alarm_servo[j].id)
								{
									ss = alarm_servo[j].Zh_CN.description;
								}
							}
							s2[i] = ss;
						}

						if (s2[i].Length == 2 || (s2[i].Length == 3 && i == Length - 1))
						{
							s2[i] = "";
						}
						if (i <= 0)
						{
							break;
						}
					}
					string[] s3 = s1[1].Split(new char[] { ',', '[', ']' }, StringSplitOptions.None);
					ArrayList s3List = new ArrayList();
					for (int i = 2; i < s3.Length - 2; i++)
					{
						if (s3[i] != "")
						{
							s3List.Add(s3[i]);
						}
						else
						{
							break;
						}
					}
					if (s3List.Count > 0)
					{
						for (int i = 0; i < s3List.Count; i++)
						{
							for (int j = 0; j < alarm_controller.Length; j++)
							{
								if (Convert.ToInt32(s3List[i].ToString()) == alarm_controller[j].id)
								{

									controllerStr += alarm_controller[j].Zh_CN.description;
									if (!(i == s3List.Count - 1))
									{
										controllerStr += ",";
									}
								}

							}
						}
					}


					for (int i = Length - 1; i > Length - 5; i--)
					{
						if (s2[i] == "")
						{
							continue;
						}
						else
						{
							EndStr += s2[i] + ",";
						}
					}
				}
			}
		}
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

語衣

感谢大哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值