C#优化字符串操作

来源:互联网 发布:老徐来巡山淘宝店 编辑:程序博客网 时间:2024/05/09 18:13
开发中可以说几乎随时会涉及到字符串处理,本人觉得很有必要把平时遇到的问题和大家一起讨论,如果大家有好的见解和心得留言和大家分享

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 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, 36);
            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, 36).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, 
36).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, 
36).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);//简单聪明

 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 厂房面积小于泄压面积怎么办 江苏海门农村自建房房产证怎么办 颈总动脉斑块形成怎么办 颈椎引起腔梗头晕怎么办 魅族手机变成英文怎么办 员工失去了工作乐趣怎么办 古墓丽影9出bug怎么办 气炉子打不着火怎么办 下面人员不参加公司拓展怎么办 重点班的差生怎么办 江苏考生选修考d怎么办 眼睛里有虫子该怎么办 屋里毛絮特别多怎么办 信用卡人员核核查单位地址怎么办 红米note电源键失灵怎么办 红米note4x跳屏怎么办 红米开机键坏了怎么办 红米note2开关键不灵敏怎么办 大学生论文检测系统忘记密码怎么办 快手实验室没有k歌怎么办 皮肤一到冬天就会起皮脱落怎么办 嘴上的皮撕破了怎么办 身体皮肤干燥起皮怎么办 把公司数据库弄宕机了怎么办 地铁上临时变站怎么办 大学实践课挂了怎么办 军训的人长得矮怎么办 军训脸被晒黑了怎么办 晚上吃了油炸的怎么办 楼梯又陡又窄怎么办 小孩不认真做作业怎么办 水厂出水水质不达标怎么办 野猪铁夹子夹到怎么办 燃气灶开孔尺寸大了怎么办 苹果电脑视频显示缺少插件怎么办 安装拼多多显示校验失败怎么办 中央庭黑盒被抢怎么办 lab值a值偏高怎么办 橱房管道堵死了怎么办 微信被别的手机同步登录怎么办 计算机机房空调坏了怎么办