日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

C#优化字符串操作【月儿原创】

發(fā)布時(shí)間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#优化字符串操作【月儿原创】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C#優(yōu)化字符串操作

作者:清清月兒

主頁(yè):http://blog.csdn.net/21aspnet/?????????? 時(shí)間:2007.6.17

??????? 開(kāi)發(fā)中可以說(shuō)幾乎隨時(shí)會(huì)涉及到字符串處理,本人覺(jué)得很有必要把平時(shí)遇到的問(wèn)題和大家一起討論,如果大家有好的見(jiàn)解和心得請(qǐng)留言和大家分享

1.Convert.ToInt32與Int32.Parse的恩恩怨怨
2.
Split的3種用法
3.
@"abc"和"abc"區(qū)別在那里
4.保留2位有效小數(shù)及
5.
url傳遞中文的解決方案
6.
把123456789轉(zhuǎn)換為12-345-6789的3種方法
7.交換兩個(gè)指定位置字符的4種方法
8.“%10”的妙用
9.輸出21個(gè)AAAAAAAAAAAAAAAAAAAAA的巧妙做法

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

這2個(gè)方法都可以把把string解析為int,那么我們一定會(huì)有疑問(wèn):到底他們有什么區(qū)別?什么時(shí)候該用什么?性能如何等等。

其實(shí)在2.0里還有Int32.TryParse也實(shí)現(xiàn)了同樣的效果。

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");

????????}

????}

}

?

表面上看,可見(jiàn)3個(gè)方法都實(shí)現(xiàn)了同樣的效果!

那么我們把代碼改一下:

??????????? //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,那么運(yùn)行結(jié)果會(huì)怎樣呢?

這是因?yàn)槿绻馕鲥e(cuò)誤:
Convert.ToInt32()null時(shí)不拋異常而是返回0;
Int32.Parse()拋異常
Int32.TryParse()不拋異常,會(huì)返回true或false來(lái)說(shuō)明解析是否成功,如果解析錯(cuò)誤,調(diào)用方將會(huì)得到0值。

由于Convert.ToInt32()在null時(shí)我們看不到Int32.TryParse()的運(yùn)行結(jié)果所以再分調(diào)試和不調(diào)試來(lái)看結(jié)果的差異:
調(diào)試:

不調(diào)試:

其實(shí)一般出bug畢竟屬于少數(shù),而且大家都會(huì)測(cè)試保證不出bug,那么我們最關(guān)心的或許就是性能。

再把代碼修改一下:
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個(gè)方法執(zhí)行100萬(wàn)次轉(zhuǎn)換毫秒差異:

為了準(zhǔn)確多做幾次測(cè)試:
第二次

第三次

?第一次第二次第三次
Convert.ToInt32()532-204=3281163-750=413782-469=313
Int32.Parse()844-532=312360-63=2971094-782=312
Int32.TryParse()1141-844=297657-360=297375-94=281

其實(shí)我們可以得出結(jié)論:
3個(gè)方法幾乎沒(méi)有差異!
如果真要追求完美那么性能的差異是:Int32.TryParse()優(yōu)于Int32.Parse()優(yōu)于Convert.ToInt32()。
所以個(gè)人建議:.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。

那么為什么會(huì)這樣呢?
其實(shí)這些數(shù)據(jù)不是偶然的,因?yàn)?#xff1a;
Convert.ToInt32 會(huì)把最終的解析工作代理給 Int32.Parse;
Int32.Parse 會(huì)把最終的解析工作代理給Number.ParseInt32;
Int32.TryParse 會(huì)把最終的解析工作代理給Number.TryParseInt32。

至于其他進(jìn)制的轉(zhuǎn)換請(qǐng)參考MSDN。重載參數(shù)即可!

2.Split的3種用法

我們可以把12???? 33?? 456??? 12342? 拼起來(lái)就是一個(gè)字符,因?yàn)楹芏鄷r(shí)候我們覺(jué)得處理只有幾個(gè)組的時(shí)候用數(shù)組很麻煩所以我們用“|”或者“,”等等把他們拼起來(lái)在需要的時(shí)候用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;
????????}

實(shí)現(xiàn)把文章按空格打散:
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"區(qū)別在那里

@"abc"和"abc"沒(méi)有什么區(qū)別

不過(guò)@是忽略轉(zhuǎn)義字符的!
比如 "abc/n" 輸出 abc 并加個(gè)換行
但是 @"abc/n" 輸出 abc/n 無(wú)換行!
取消轉(zhuǎn)義

比如你想將 C:/windows/system 這個(gè)字符串賦值給 str

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

因?yàn)樵贑#中,// 才會(huì)被轉(zhuǎn)義成一個(gè) /
又例如/n就是換行符

而加入@,就可以這樣:

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

4.保留2位有效小數(shù)及
這又是一個(gè)經(jīng)常遇到的問(wèn)題。

保留2位有效小數(shù)(和保留N位一樣的參數(shù)不同而已):

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

?


四舍五入:

static?void?Main()
????????
{?

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

5.url傳遞中文的解決方案

1.設(shè)置web.config文件。
<system.web>
......
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
......
</system.web>
2.傳遞中文之前,將要傳遞的中文參數(shù)進(jìn)行編碼,在接收時(shí)再進(jìn)行解碼。
>> 進(jìn)行傳遞
string Name = "中文參數(shù)";
Response.Redirect("B.aspx?Name="+Server.UrlEncode(Name));
>> 進(jìn)行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));

3.如果是從 .HTML 文件向 .Aspx 文件進(jìn)行傳遞中文參數(shù)的話(即不從后臺(tái)用 Redirect()方法進(jìn)行 Url 轉(zhuǎn)換)。一樣要將傳遞的中文參數(shù)進(jìn)行編碼,在接收時(shí)再進(jìn)行解碼。
>> 進(jìn)行傳遞
<script language="JavaScript">
function GoUrl()
{
var Name = "中文參數(shù)";
location.href = "B.aspx?Name="+escape(Name);
}
</script>
<body οnclick="GoUrl()">
>> 進(jìn)行接收
string Name = Request.QueryString["Name"];
Response.Write(Server.UrlDecode(Name));

一般來(lái)說(shuō)。設(shè)置web.config文件就可以了。但是如果你用 JavaScript 調(diào)用 webservice 方法的話(往webservice里面?zhèn)鬟f中文參數(shù))。設(shè)置 web.config 文件好象無(wú)效。 //清清月兒http://blog.csdn.net/21aspnet/

6.把123456789轉(zhuǎn)換為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.交換兩個(gè)指定位置字符的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個(gè)AAAAAAAAAAAAAAAAAAAAA的巧妙做法

new構(gòu)造器的理解
如果要你創(chuàng)建一個(gè)由21個(gè)"A"字符構(gòu)成的字符串,你會(huì)怎么做?
string str = "AAAAAAAAAAAAAAAAAAAAA";//老實(shí)型
string str = new string(
'A', 21);//簡(jiǎn)單聰明

10.compare()與compareTo()方法

一樣的功能,只是兩個(gè)接口的兩個(gè)方法而已 ?
? compare是Comparatable的方法,compareTo是Comparator的方法

總結(jié)

以上是生活随笔為你收集整理的C#优化字符串操作【月儿原创】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。