字符串比较



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 的初始化也是需要时间的

以下代码,字符串不会在运行时进行拼接,而是会在编译时直接生成一个字符串。

private static void NewMethod3()
{
       string re2="123"+"abc"+"456";   ///该代码等效于///string re2="123abc456";  
}

private static void NewMethod4()
{
      const string a="t";
      string re="abc"+a;   ///因为a是一个常量,所以该代码等效于string=re="abc"+"t";  最终等效于string re="abct";  
}  

如果有别的类型,最好先用.toString()的方法转换。

 

感谢#5楼 2014-03-24 16:45 残蛹 博友提供的说明

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();
}

  

bool类型的判断返回

这种现象常见于新手程序员中

//写法1
if(state == 1)
{
    return true;
}
else
{
    return false;
}
//写法2
return state == 1 ? true : false;
//优化后
return state == 1;

  原文:C#中那些[举手之劳]的性能优化

 

 

 

 

 

 

posted on 2014-04-02 10:07  枫叶飘零黄昏血  阅读(235)  评论(0编辑  收藏  举报