字符串比较
这个可能很多人知道了,但还是提一下。
- string s = “”;
- 1) if(s == “”){}
- 2) if(s == string.Empty){}
- 3) if (string.IsNullOrEmpty(s)) { }
- 4) if(s != null && s.Length ==0) {}
- 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),不要告诉我只有我一个人这么干)
另一种经常遇到的字符串拼接
- public string JoinIds(List<User> users)
- {
- StringBuilder sb = new StringBuilder();
- foreach (var user in users)
- {
- sb.Append(“‘”);
- sb.Append(user.Id);
- sb.Append(“‘,”);
- }
- sb.Length = sb.Length – 1;
- return sb.ToString();
- }
对于这种情况有2中优化的方案
对于3.5以上可以直接使用Linq辅助,这种方案代码少,但是性能相对差一些
- public string JoinIds(List<User> users)
- {
- return “‘” + string.Join(“‘,'”, users.Select(it => it.Id)) + “‘”;
- }
对于非3.5或对性能要求极高的场合
- public string JoinIds(List<User> users)
- {
- var ee = users.GetEnumerator();
- StringBuilder sb = new StringBuilder();
- if (ee.MoveNext())
- {
- sb.Append(“‘”);
- sb.Append(ee.Current.Id);
- sb.Append(“‘”);
- while (ee.MoveNext())
- {
- sb.Append(“,'”);
- sb.Append(ee.Current.Id);
- sb.Append(“‘”);
- }
- }
- return sb.ToString();
- }