string常用API整理+扫盲

255 阅读3分钟

字符

一个char代表一个Unicode字符
System.Char别名,常用静态方法:

char.ToUpperInvariant('');
char.IsLetter();
char.IsUpper();
char.IsWhiteSpace();

字符串

string(System.String)是一个不可变的字符序列。

判空

string s = @"Hello World!";
//静态方法
string.IsNullOrEmpty(s);

遍历

string实现了IEnumerable<char>

foreach(char i in s){
	...
}

字符串内搜索

s.StartWith("");
s.Contains("");
s.EndWieh("")
//indexof匹配不到返回-1
s.IndexOf("",0,CurrentCultureIgnoreCase);

字符串处理

string是不可变的,每次处理的结果都是返回一个新的字符串。

提取字符串

//参数:开始位置、长度(索引从0开始)
string s1 = s.SubString(0,3);

插入和删除

//参数:位置索引、插入内容
string s1 = s.Insert(0,",");
//参数:索引、长度
string s2 = s.Remove(5,2);

Trim和Replace

TrimStart()TrimEnd()Trim()删除特定字符,不指定默认删除空白字符(空格、制表符和换行符等)

s1 = s.Trim();

字符串分割与连接

Split

默认使用空白字符做分隔符,也可以接受charstringparams

s1 = s.Split();

Join

s1 = s.Join(",",new string[]{"s1","s2","s3"});

String.Format静态方法

基本用法:

string s = string.Format("Hello {0}, this is {1}",yourname,myname);

字符串等值比较

基本用法

//第一种
 if(s1 == s2)
 if(s1.Equals(s2))
 //第二种
 if(string.Equals(s1,s2,StringComparison.CurrentCulture))

有了两种区别,我们通常使用的==比较实际上是序列比较,但是更推荐第二种静态方法,因为它在其中一个字符串为Null时也不会抛出空引用异常。
字符串的比较有两种算法,注意上面静态的Equals方法的第三个的参数,它指定了字符串比较的类型。

  • 序列算法:直接将字符串解析为按照Unicode编码方式的数字。
  • 文化相关比较:按照特定的字母表解析字符串。 贴一下StringComparison枚举类型的代码:
  public enum StringComparison
  {
      CurrentCulture = 0,
      CurrentCultureIgnoreCase = 1,
      InvariantCulture = 2,
      InvariantCultureIgnoreCase = 3,
      Ordinal = 4,
      OrdinalIgnoreCase = 5
  }

看的出来大概分成三种:

  • CurrentCulture:按照当前文化规则解析字符串。
  • InvariantCulture:按照不变规则(美国)解析字符串。
  • Ordinal:按照Unicode序列化为数字。

字符串顺序比较

两种方式:实例方法CompareTo()和静态方法Compare()
具体写法如下:

//实例方法
s1.CompareTo(s2);
//静态方法
string.Compare(s1,s2,StringComparison.CurrentCulture);

s1排序在s2之前返回-1,排序相等返回0,在s2之后返回1。

StringBuilder类

由于string是不可变的,所以反复对字符串进行操作会造成比较大的开销,而调用StringBuilder这个类不需要替换整个StringBuilder对象,可以直接对子字符串进行操作。
常用实例方法

  • Append
  • Replace
  • Insert
  • Remove 除此之外,每个实例对象还有一个Length属性。 如果要将一个StringBuilder对象清空,可以直接将它的Length属性设置为0,也可以创建一个新的空StringBuilder对象:
StringBuilder sb = new StringBuilder("Hello World!");
//Length设置为0
sb.Length = 0;
//新创建一个对象,内容为空的引用
sb = new StringBuilder();

注意:推荐使用第二种方式,第一种方式会在整个作用域内sb都在内存中,垃圾回收不会处理它引用的内存。

有关文本编码

文本编码是将字符从其数字代码点映射到二进制表示的方法。读取流和文本时,文本编码器会先将二进制数字转换为Unicode表示,程序在使用特定的Unicode表示去读取内容就可以获取正确的char和string。

获取Encoding对象(或者静态属性)、

//获取对象
Encoding utf8 = Encoding.GetEncoding(""utf-8);
//获取实例属性
Encoding utf8 = Encoding.UTF8;

有关字节数组转换

有用老版本.net framework写过创建http请求的小伙伴应该被这东西恶心过,每次创建一个请求的流程都是:
创建一个要发送的对象 => Json序列化 => 将序列化后的string转换为字节数组byte[] => 用流将字节数组写进RequestBody

每次都要指定指定具体的请求头和请求体以及编码方式之类的参数真的很恼火了。
将string转换为byte[]

byte[] data = Encoding.UTF8.GetBytes(s1);

将byte[]转换为string

string responseString = Encoding.UTF8.GetString(data);