C#优化字符串操作

来源:互联网 发布:张子凡 陆林轩 知乎 编辑:程序博客网 时间:2024/06/07 10:31

作者:清清月儿

转自:http://blog.csdn.net/21aspnet/article/details/1655136


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

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=3281163-750=413782-469=313Int32.Parse()844-532=312360-63=2971094-782=312Int32.TryParse()1141-844=297657-360=297375-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 onclick="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.compare()与compareTo()方法

一样的功能,只是两个接口的两个方法而已   
  compare是Comparatable的方法,compareTo是Comparator的方法


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 h5中的摇晃手机在电脑端怎么办 忘记手机锁屏密码怎么办4g qq最早绑定的号码忘记了怎么办 重启路由器之后宽带连接不上怎么办 微信授权小程序总是不行怎么办 微信把钱转到别人账户里了怎么办 微信转到对方账户停用了怎么办 微信号被认为是投票水军怎么办 微信投票时显示账号异常怎么办 京东商城买东西老不到货怎么办 优酷投屏一会就会出现花报怎么办 苹果手机的app安卓找不到怎么办 微信网页获取用户信息点了否怎么办 淘宝卖家退发货信息选择错了怎么办 法宣在线出现在其他地方登陆怎么办 QQ被冻结又不知道申诉资料怎么办 开通优酷会员了再开酷喵会员怎么办 考的不好时别人问你多少分时怎么办 订了产品一直收不到货怎么办 微信零钱提现忘记密码怎么办 微信里面的零钱忘记密码怎么办 微信的零钱密码丢了怎么办 微信公众号被屏蔽了所有功能怎么办 刚开淘宝店没信誉要怎么办 如果发现货品有问题商家不换怎么办 文件夹里面的图片怎么拖不动怎么办 网赌系统维护审核就不给提款怎么办 客户说我卖的东西是假货怎么办 微信小程序第三方平台倒闭了怎么办 金立手机锁屏密码忘了怎么办 不知道微信账号的公众号密码怎么办 微信公众号充话费充错号码怎么办 蜻蜓商城三天免流业务退不了怎么办 日上免税店提货日期写错了怎么办 微信公众平台账号名密码忘了怎么办 有人扬言要搞垮我的店铺怎么办 招行信用卡签到积分未领取怎么办 怎么办照片发送到邮微信箱里去 苹果手机备忘录没刪除就没了怎么办 因恶意刷公众号而被微信封号怎么办 禁停路段发生剐蹭怎么办办