C#优化字符串操作

开发中可以说几乎随时会涉及到字符串处理,本人觉得很有必要把平时遇到的问题和大家一起讨论,如果大 家有好的见解和心得留言和大家分享

1. Convert.ToInt32 与Int32.Parse的恩恩 怨怨
2. Split的3种用法
3. @"abc"和"abc"区别在那里
4.保留2位有效小数及
5. url传递中文的解决方案
6. 把123456789转换为12-345-6789的3 种 方法
7.交换两个指定位置字符的4 种方法
8.“%10” 的妙用
9.输出21个AAAAAAAAAAAAAAAAAAAAA的巧妙做法

1. Convert.ToInt32Int32.Parse 的恩恩怨怨

这2个方法都可以把把string解析为int,那么我们一定会有疑问:到底他们有什么区别?什么时候该用什么?性能如何等等。

其实在2.0里还有Int32.TryParse也实现了同样的效果。


using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  ConsoleApplication1
{
    
class  Program
    
{
        
static   void  Main( string [] args)
        
{
            
string  myString  =   " 1234 " ;
            
int  myint  =   0 ;

            myint 
=  Convert.ToInt32(myString);
            Console.Write(myint
+ "/r/n " );

            myint 
=  Int32.Parse(myString);
            Console.Write(myint
+ "/r/n " );

            Int32.TryParse(myString, 
out  myint);
            Console.Write(myint
+ " /r/n " );

        }

    }

}

 

表面上看,可见3个方法都实现了同样的效果!

那么我们把代码改一下:

            //string myString = "1234";
            string myString = null;
            int myint = 0;

            myint = Convert.ToInt32(myString);
            Console.Write(myint+"/r/n");

            myint = Int32.Parse(myString);
            Console.Write(myint+"/r/n");

            Int32.TryParse(myString, out myint);
            Console.Write(myint+"/r/n");
这次字符串是null,那么运行结果会怎样呢?

这是因为如果解析错误:
Convert.ToInt32()null 时不抛异常而是返回0;
Int32.Parse()抛 异常
Int32.TryParse() 不抛异常,会返回true或false来说明解析 是否成功,如果解析错误,调用方将会得到0值。

由于Convert.ToInt32()在null时我们看不到Int32.TryParse()的 运行结果所以再分调试和不调试 来看结果的差异:
调试:

不调试:

其实一般出bug毕竟属于少数,而且大家都会测试保证不出bug,那么我们最关心的或许就是性能。

再把代码修改一下:
2

             string  myString1  =   " 1234 " ;
            
// string myString = null;//清清月儿 http://blog.csdn.net/21aspnet/
             int  myint  =   0 ;
            Console.Write(System.DateTime.Now.ToString()
+ "    " + System.DateTime.Now.Millisecond.ToString()  +   " " );
            
for  ( int  i  =   0 ; i  <   1000000 ;i ++  )
            
{
                myint 
=  Convert.ToInt32(myString1);
            }

            Console.Write(myint 
+   " /r/n " );
            Console.Write(System.DateTime.Now.ToString() 
+   "    "   +  System.DateTime.Now.Millisecond.ToString()  +   "/r/n " );


            
string  myString2  =   " 1234 " ;
            
for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
            
{
                myint 
=  Int32.Parse(myString2);
            }

            Console.Write(myint 
+   "/r/n " );
            Console.Write(System.DateTime.Now.ToString() 
+   "    "   +  System.DateTime.Now.Millisecond.ToString()  +   " " );

            
string  myString3  =   " 1234 " ;
            
for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
            
{
                Int32.TryParse(myString3, 
out  myint);
            }

            Console.Write(myint 
+   "/r/n " );
            Console.Write(System.DateTime.Now.ToString() 
+   "    "   +  System.DateTime.Now.Millisecond.ToString()  +   "/r/n " );


我们让3个方法执行100万次转换 毫 秒差异:

为了准确多做几次测试:
第二次

第三次


  第一次 第二次 第三次
Convert.ToInt32() 532-204=328 1163-750=413 782-469=313
Int32.Parse() 844-532=312 360-63=297 1094-782=312
Int32.TryParse() 1141-844=297 657-360=297 375-94=281

其实我们可以得出结论:
3个方法几乎没有差异!
如果真要追求完美那么 性能的差异是:Int32.TryParse() 优于Int32.Parse()优于 Convert.ToInt32()。
所以个人建议:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。

那么为什么会这样呢?
其实这些数据不是偶然的,因为:
Convert.ToInt32 会把最终的解析工作代理给 Int32.Parse;
Int32.Parse 会把最终的解析工作代理给Number.ParseInt32;
Int32.TryParse 会把最终的解析工作代理给Number.TryParseInt32。

至于其他进制 的转换请参考MSDN。重 载参数 即可!

2. Split 的 3种用法

我们可以把12     33   456    12342  拼起来就是一个字符,因为很多时候我们觉得处理只有几个组的时候用数组很麻烦所以我们用“|”或者“,”等等把他们拼起来在需要的时候用Split 打 散即可。//清清月儿 http://blog.csdn.net/21aspnet/

下面列举一些用法,不做性能分析了。
方法一:

static   void  Main( string [] args)
        
{
            
string  aa  =   " 1234,234523,4324,324 " ;// 清清月儿 http://blog.csdn.net/21aspnet/
            
string [] cc  =  aa.Split( new   char []  ' , '  } );
            
foreach  ( string  bb  in  cc)
            
{
                Console.Write(bb 
+   "/r/n " );
            }

           
        }

方法二:

string  aa  =   " 1234,234523,4324,324 " ;
            
string [] str  =  aa.Split( ' , ' );
            
foreach  ( string  bb  in  str)
            
{
                Console.Write(bb 
+   " /r/n " );
            }


方法三:

static   void  Main( string [] args)
        
{
            
string  a  =   " 1,2,3,4,5,6,7,8,9 " ;
            
string  b  =   " , " ;
            
string [] c  =  Split(a, b);
            
foreach  ( string  bb  in  c)
            
{
                Console.Write(bb 
+   " /r/n " );
            }


        }

        
public   static   string [] Split( string  input,  string  pattern)
        
{
            
string [] arr  =  System.Text.RegularExpressions.Regex.Split(input, pattern);
            
return  arr;
        }


实现把文章按空格打散:

public   static   void  Main () 
    
{
        
string  a = " While laughter is is very aerobic activity engages every single organ system " ;
        
string  b = "   " ;
        
string  []c = TestDoWhile.Split(a,b);
        
foreach ( string  bb  in  c)
        
{
            Console.Write(bb
+ " /r/n " );
        }

    }

    
public   static   string [] Split( string  input, string  pattern)
    
{
        
string [] arr  =  System.Text.RegularExpressions.Regex.Split(input,pattern);
        
return  arr;
    }

3. @"abc " 和"abc" 区别在那里

@"abc"和"abc"没有什么区别

不过@是忽略转义字符的!
比 如 "abc/n" 输出 abc 并加个换行
但是 @"abc/n" 输出 abc/n 无换行!
取消转义

比如你想将 C:/windows/system 这个字符串赋值给 str

一般情况下要:
string str = "C://windows//system";

因为在C#中,// 才会被转义成一个 /
又例如/n就是换行符

而加入@,就可以这样:

string str = @"C:/windows/system";

4. 保留2位有效小数及
这又是一个经常遇到的问题。

保留2 位有效小数(和保留N位 一样的参数不 同而已):

  static   void  Main()
        
{
            Double a 
=   12.345678 ;
            Console.Write(Math.Round(a,
2 ));
        }



四舍五入:

static   void  Main()
        


            Double a 
=   12.345678 ; // 是要四舍五入的数
            Console.Write((a * 10000 + 0.5 ) / 10000 );
        }

5. url传递 中文的解决方案

1.设置web.config 文 件。
<system.web>
......
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
......
</system.web>
2.传递中 文之前,将要传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
string Name = "中文参数";
Response.Redirect("B.aspx?Name="+Server.UrlEncode (Name));
>> 进行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));

3.如果是从 .HTML 文件向 .Aspx 文件进行传递中文参数的话(即不从后台用 Redirect()方法进行 Url 转换)。一样要将传递的中文参数进行编码,在接收时再进行解码。
>> 进行传递
<script language="JavaScript">
function GoUrl()
{
var Name = "中文参数";
location.href = "B.aspx?Name="+escape (Name);
}
</script>
<body οnclick="GoUrl()">
>> 进行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));

一般来说。设置web.config 文件就可以了。但是如果你用 JavaScript 调用 webservice 方法的话(往webservice里面传递中文参数)。设置 web.config 文件好象无效。 //清清月儿http://blog.csdn.net/21aspnet/

6. 把 123456789转换为12-345-6789的3种方法

方法一:
 

             string  a  =   " 123456789 " ;
            a 
=   int .Parse(a).ToString( " ##-###-#### " );
            Console.Write(a);


方法二:

string  a  =   " 123456789 " ;
            a 
=  a.Insert( 5 " - " ).Insert( 2 " - " );
            Console.Write(a);


方法三:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Text.RegularExpressions;
namespace  ConsoleApplication1
{
    
class  Program
    
{
        
static   void  Main()
        
{
            
string  a  =   " 123456789 " ;

            Regex reg 
=   new  Regex( @" ^(d{2})(d{3})(d{4})$ " );
            a 
=  reg.Replace(a,  " $1-$2-$3 " );
            Console.Write(a);
        }

        
    }

}

7. 交换两个指 定位置字符的4种方法

方法一:

static   void  Main()
        
{
            
string  s  =   " 123456789 " ;
            SwapChar(
ref  s,  3 6 );
            Console.Write(s.ToString());
        }


        
static   void  SwapChar( ref   string  s,  int  i1,  int  i2)
        
{
            
char  temp  =  s[i1];
            
char  temp1  =  s[i2];
            s 
=  s.Remove(i1,  1 ).Insert(i1, temp1.ToString());
            s 
=  s.Remove(i2,  1 ).Insert(i2, temp.ToString());
        }


方法二:

  static   void  Main()
        
{
            
string  s  =   " 123456789 " ;
            
// SwapChar(s, 3, 6);
            Console.Write(SwapChar(s,  3 6 ).ToString());
        }


        
static   string  SwapChar( string  s,  int  p1,  int  p2)
        
{
            
if  ((p1  ==  p2)  ||  ((p1  <   0 ||  (p2  <   0 )))  return  s;
            
if  ((p1  >=  s.Length)  ||  (p2  >=  s.Length))  return  s;
            
char [] vChars  =  s.ToCharArray();
            vChars[p1] 
=  ( char )(vChars[p2]  |  (vChars[p2]  =  vChars[p1])  &   0 );
            
return   new   string (vChars);
        }

方法三:

static   void  Main()
        
{
            
string  s  =   " 123456789 " ;
            Console.Write(SwapChar(s, 
3 6 ).ToString());
        }


        
public   static   string  SwapChar( string  str,  int  a,  int  b)
        
{
            
char [] newStr  =  str.ToCharArray();
            newStr[a] 
=  str[b];
            newStr[b] 
=  str[a];
            
return   new   string (newStr);
        }


方法四:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Text.RegularExpressions;
namespace  ConsoleApplication1
{
    
class  Program
    
{
        
static   void  Main()
        
{
            
string  s  =   " 123456789 " ;
            Console.Write(SwapChar(s, 
3 6 ).ToString());
        }


        
static   string  SwapChar( string  s,  int  p1,  int  p2)
        
{
            
if  (p1  >  p2)  int  p  =  p1; p1  =  p2; p2  =  p; }
            
return  Regex.Replace(s,  " ^(.{ "   +  p1  +   " })(.)(.{ "   +  (p2  -  p1  -   1 +   " })(.)(.*)$ " " $1$4$3$2$5 " );
        }


    }

}


8. “% 10” 的 妙用

static   void  Main()
        
{

            Random r 
=   new  Random();

            Console.WriteLine(r.Next() 
%   10 ); // 1-9
            Console.WriteLine(r.Next()  %   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
            Console.WriteLine(r.Next() 
%   10 );
        }


9.输出21个AAAAAAAAAAAAAAAAAAAAA的巧妙做法

new构造器的理解
如果要你创建一个由21个"A"字符构成的字符串,你会怎么做?
string str = "AAAAAAAAAAAAAAAAAAAAA";//老实型
string str = new string( 'A' , 21);//简单聪明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值