Code Bye

C#性能优化: 字符串拼接

字符串比较

这个可能很多人知道了,但还是提一下。

  1. string s = “”;
  2. 1) if(s == “”){}
  3. 2) if(s == string.Empty){}
  4. 3) if (string.IsNullOrEmpty(s)) { }
  5. 4) if(s != null && s.Length ==0) {}
  6. 5) if((s+“”).Length == 0){}

1,2最慢 3较快 4,5最快

1,2几乎没区别 4,5几乎没区别,不过这个只适用于比较null和空字符串,如果是连续的空白就是string.IsNullOrWhiteSpace最快了,不过这个方法2.0里面没有。

所以2.0可以这样 (s+””).trim() == 0

这里的关键就是 s + “” 这个操作可以把null转换为””

注意第二个参数只能是””或string.Empty 这样的累加几乎是不消耗时间的,如果第二个参数是” “(一个空格)这个时间就远远不止了。

字符串拼接

字符串累加,这个道理和Regex一样,不要盲目崇拜StringBuilder,在大量(或不确定的)string拼接的时候,StringBuilder确实可以起到提速的作用,而少数几个固定的string累加的时候就不需要StringBuilder 了,毕竟StringBuilder 的初始化也是需要时间的。

ps: 这段我确实记得我是写过的来着,不知道怎么的,发出来的时候就不见了…..

此外还有一个string.Concat方法,该方法可以小幅度的优化程序的速度,幅度很小。

他和string.Join的区别在于没有间隔符号(我之前常用string.Join(“”,a,b,c,d),不要告诉我只有我一个人这么干)

另一种经常遇到的字符串拼接

  1. public string JoinIds(List<User> users)
  2. {
  3.     StringBuilder sb = new StringBuilder();
  4.     foreach (var user in users)
  5.     {
  6.         sb.Append(“‘”);
  7.         sb.Append(user.Id);
  8.         sb.Append(“‘,”);
  9.     }
  10.     sb.Length = sb.Length – 1;
  11.     return sb.ToString();
  12. }

对于这种情况有2中优化的方案

对于3.5以上可以直接使用Linq辅助,这种方案代码少,但是性能相对差一些

  1. public string JoinIds(List<User> users)
  2. {
  3.     return “‘” + string.Join(“‘,'”, users.Select(it => it.Id)) + “‘”;
  4. }

对于非3.5或对性能要求极高的场合

  1. public string JoinIds(List<User> users)
  2. {
  3.     var ee = users.GetEnumerator();
  4.     StringBuilder sb = new StringBuilder();
  5.     if (ee.MoveNext())
  6.     {
  7.         sb.Append(“‘”);
  8.         sb.Append(ee.Current.Id);
  9.         sb.Append(“‘”);
  10.         while (ee.MoveNext())
  11.         {
  12.             sb.Append(“,'”);
  13.             sb.Append(ee.Current.Id);
  14.             sb.Append(“‘”);
  15.         }
  16.     }
  17.     return sb.ToString();
  18. }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#性能优化: 字符串拼接