当前位置: 首页 > 编程日记 > 正文

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

C#优化字符串操作

作者:清清月儿

主页:http://blog.csdn.net/21aspnet/           时间:2007.6.17

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

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=313
Int32.Parse()844-532=312360-63=2971094-782=312
Int32.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 ο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, 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);//简单聪明

10.compare()与compareTo()方法

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

相关文章:

构筑超异构计算时代,英特尔 AI 全布局

作者 | 伍杏玲出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;我们正值数据井喷时代&#xff0c;据 IDC 发布《数据时代 2025》报告显示&#xff0c;全球每年产生的数据将从 2018 年的 33ZB 增长到 2025 年的 175ZB。其中大部分为非结构化数据&#xff0c;对数据实时…

[软件推荐]电子日记本EDiary,记下您 的每一天

推荐一款电子日记本EDiary&#xff0c;可以记下每天的工作与生活&#xff0c;可支持附件上传&#xff0c;使用方便简单&#xff0c;我从08年开始使用至今&#xff0c;感觉非常不错&#xff0c;也介绍给同事朋友使用&#xff0c;现给大家分享一下。可以到这里下载&#xff1a;ht…

C#的6种常用集合类大比拼【月儿原创】

C#的6种常用集合类大比拼 作者&#xff1a;清清月儿 主页&#xff1a;http://blog.csdn.net/21aspnet/ 时间&#xff1a;2007.6.27 说明&#xff1a;MSDN没有说出几种集合类其间的区别&#xff0c;当然欲知更多细节可参考MSDN。 一.先来说说数组的不足&#xf…

“35岁才是一个程序员成熟的开始!”

作者 | 王晓波&#xff0c;同程旅行机票事业群CTO【写在前面】不知道从什么时候开始&#xff0c;身边的“小朋友”们都开始为一件事感到焦虑&#xff0c;那就是&#xff1a;“到了35岁我还能找到一份编程的工作吗&#xff1f;”。坦白讲&#xff0c;我年轻的时候也有过迷茫的时…

centos安装easy_instal

easy_install与yum类似&#xff0c;使用easy_install&#xff0c;可以轻松在pypi软件库里面搜索python各类软件安装easy_install比较简单&#xff0c;如果配置好yum&#xff0c;就可以直接搜索python-setuptoolsyum –y install python-setuptools安装完python-setuptools之后&…

如何用xmanager远程连接centos6.0的桌面

在centos6.0系统上设置 修改custom.conf文件 vim /etc/gdm/custom.conf 在[security]下面添加 AllowRemoteRoottrue 在[xdmcp]下面添加 Port177 Enable1 修改完后效果如下&#xff1a; [daemon] [security] AllowRemoteRoottrue [xdmcp] Port177 Enable1 [greeter] [chooser] […

ASP.NET 3.5 企业级开发

议题 .NET Framework 3.5 和Visual Studio 2008 C# 面向对象程序设计 ASP.NET 状态管理和页面传值 ASP.NET 中的错误处理 ADO.NET与数据访问 架构与模式 安全与性能 优秀的团队开发管理功能C# 面向对象程序设计封装继承性多态性抽象类接口装箱和拆箱泛型ASP.NET 状态管理…

DEV报表之条形码

今天无意间发现DEV的报表居然自带条形码生成控件&#xff0c;正好要用到&#xff0c;省的自己手动生成图片了。前提&#xff1a;一张做好的报表Dev报表基础教程首先拖出XRBarCode控件&#xff0c;放到表头的空白位置&#xff0c;摆好高度宽度。选择Symbology&#xff0c;设置你…

Copilot 真会砸了程序员的饭碗?

作者 | 马超 责编 | 孙胜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;最近OpenAI与GitHub联合构建的AI自动编程工具Copilot正式登场&#xff01;Copilot基于自然语言处理模型GPT-3搭建而成&#xff0c;可在程序员编写代码时提供建议&#xff0c;甚至直接补…

提升城镇化质量 有利于激活智慧城市潜能

国家发展改革委副主任胡祖才指出&#xff0c;智慧城市建设是中国新型城镇化的重要内容&#xff0c;也是推进我国新型城镇化建设的一项长期的任务。如何通过智慧城市建设&#xff0c;促进城市发展模式向资源节约型、环境友好型转变&#xff0c;城市管理由粗放型、经济型向精专化…

变量的属性(全局变量、局部变量、动态变量、静态变量等)

变量的属性 1、变量的分类 l 根据作用域&#xff1a;可分为全局变量和局部变量。 l 根据生存周期&#xff1a;可分为静态存储方式和动态存储方式&#xff0c;具体地又分为自动的&#xff08;auto&#xff09;、静态的&#xff08;static&#xff09;、寄…

Science论文:诺奖经济学家的经典决策模型,被AI挑战

在2019年DOTA2的顶级赛事TI8的正赛完成之后&#xff0c;OpenAI的人工智能战队与TI8的冠军OG举行了一场表演赛&#xff0c;在英雄阵容限定17个&#xff0c;部分道具和功能禁用的前提下&#xff0c;OpenAI以2&#xff1a;0完胜了OG&#xff0c;尤其值得一提的是第二场比赛仅用时1…

Canny算法源码,欢迎交流

http://blog.csdn.net/jianxiong8814/article/details/1563109 http://blog.csdn.net/assuper/article/details/6937130 存在的bug 在dsp http://bbs.csdn.net/topics/390445572

Provisioning Services 7.8 入门系列教程之十三 使用 Boot Device Management(BDM)

续Provisioning Services 7.8 入门系列教程之十二 实现高可用性 可以使用 Boot Device Management 实用程序将 IP 和引导信息&#xff08;引导设备&#xff09;交付给目标设备&#xff0c;此方法可以取代传统的 DHCP、PXE 和 TFTP 方法。 如果使用此方法&#xff0c;当目标设备…

Memcached深度分析

Memcached是danga.com&#xff08;运营LiveJournal的技术团队&#xff09;开发的一套分布式内存对象缓存系统&#xff0c;用于在动态系统中减少数据库负载&#xff0c; 提升性能。关于这个东西&#xff0c;相信很多人都用过&#xff0c;本文意在通过对memcached的实现及代码分析…

【分享】 IT囧事

导读&#xff1a;企业的业务发展离不开信息化建设&#xff0c;信息系统的稳定运行更离不开IT运维的支持&#xff0c;许多生命期短暂或者使用效果不太好的IT系统&#xff0c;都是因为后期的维护和支持不到位&#xff0c;才导致前期投入的资金和人力付之东流&#xff0c;让人扼腕…

为什么掌握Linux对程序员这么重要……

人工智能、物联网、大数据时代&#xff0c;Linux正有着一统天下的趋势&#xff0c;几乎每个软件工程师岗位&#xff0c;都要求掌握Linux。可以说&#xff0c;打开 Linux 操作系统这扇门&#xff0c;你才是合格的软件工程师。如果不能熟练地操作 Linux&#xff0c;你基本上等于少…

Java并发编程有多难?这几个核心技术你掌握了吗?

本文主要内容索引 1、Java线程 2、线程模型 3、Java线程池 4、Future(各种Future) 5、Fork/Join框架 6、volatile 7、CAS&#xff08;原子操作&#xff09; 8、AQS&#xff08;并发同步框架&#xff09; 9、synchronized&#xff08;同步锁&#xff09; 10、并发队列&#xff0…

这届 AI 预测欧洲杯冠军,通通被打脸

持续了一个月的欧洲杯&#xff0c;终于落下帷幕。北京时间 7 月 12 日&#xff08;周一&#xff09;凌晨&#xff0c;本届欧洲杯决赛中&#xff0c;意大利对阵英格兰。两队在 120 分钟时间里 1-1 战平&#xff0c;意大利在欧洲杯中通过点球大战以 3:2击败英格兰夺冠。意大利上次…

资源的正确引用

对资源的引用应该发生在对资源的保护期间。 比如在所保护内hold住资源、local_bh_disable内hold住资源&#xff1b; 否则对资源的使用可能发生不一致的情况。 PS&#xff1a; 代码逻辑应该符合真实世界的合理逻辑。转载于:https://www.cnblogs.com/kernel521/p/4045976.html

给网站管理员的建议:创建可利用的、可抓取的网站

转载自 谷歌中文网站管理员博客 发表者 T.V. Raman&#xff0c;研究学者 原文&#xff1a; Webmaster tips for creating accessible, crawlable sites 发表于&#xff1a;2008年4月14日 上午10:47 Hubbell和我正在我们位于加州的家中度假。欢迎您随时 阅读在此之前我为网站管…

iptables如何开放被动模式的FTP服务

如何开放被动模式的FTP服务? 1.装载FTP追踪时的专用的模块; # modprobe nf_conntrack_ftp # lsmod | grep ftp 2.放行请求报文 命令连接&#xff1a; NEW&#xff0c;ESTABLISHED 数据连接&#xff1a; RELATED&#xff0c;ESTABLISHED #iptables -I INPUT -d 192.168.141.10 …

KNN 分类算法原理代码解析

作者 | Charmve来源 | 迈微AI研习社k-最近邻算法是基于实例的学习方法中最基本的&#xff0c;先介绍基x于实例学习的相关概念。基于实例的学习已知一系列的训练样例&#xff0c;很多学习方法为目标函数建立起明确的一般化描述&#xff1b;但与此不同&#xff0c;基于实例的学习…

Roadsend PHP-开源的PHP代码编译器

Roadsend PHP 是一个开源的php compiler, 可以将你的PHP代码编译成原生的二进制代码, 无需分发php源码. Roadsend 可以将你的PHP web项目编译成FastCGI的可执行文件,这样apache,nginx可以通过fastcgi方式和编译后的 程序进行通讯. 看起来,PHP 编写的程序可以和C编写的程序有同…

Android安卓开发中图片缩放讲解

安卓开发中应用到图片的处理时候&#xff0c;我们通常会怎么缩放操作呢&#xff0c;来看下面的两种做法&#xff1a; 方法1&#xff1a;按固定比例进行缩放 在开发一些软件&#xff0c;如新闻客户端&#xff0c;很多时候要显示图片的缩略图&#xff0c;由于手机屏幕限制&#x…

a标签是什么意思 怎么使用?

转自&#xff1a;https://www.imooc.com/qadetail/190881 (1) a标签的作用&#xff1a;超链接&#xff0c;用于跳转到别的网页。 (2) a标签的用法&#xff1a;<a href"网址" target"_blank" >到百度首页</a> 其中target是a标签的一个属性&…

【Java】Lucene检索引擎详解

基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用&#xff0c;而是是一个用Java写的全文索引引擎工具包&#xff0c;它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者&#xff1a;Lucene的贡献者Doug Cutting是一位资深全…

大手笔 !Julia Computing 获 2400 万美元融资,前 Snowflake CEO 加入董事会

整理 | 梦依丹出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;2021 年 7 月 19 日&#xff0c;由 Julia 高性能编程语言创始人成立的 Julia Computing 公司完成了 2400 万美元的 A 轮融资&#xff0c;这笔融资由 Dorilton Ventures 领投&#xff0c;Menlo Ventures…

(Mirage系列之六)在Mirage里使用Collection

在Mirage中&#xff0c;Collection是包含一个或多个CVD的集合。 Collection的主要作用是简化操作。比如我有一百个终端设备需要分配基础层&#xff0c;如果没有Collection&#xff0c;那么管理员需要逐个点击。这是无趣的重复劳动。有了Collection&#xff0c;只要选择一个Coll…

WAS服务器负载测试软件导读

转帖&#xff1a;出处未知 你的Web服务器和应用到底能够支持多少并发用户访问&#xff1f;在出现大量并发请求的情况下&#xff0c;软件会出现问题吗&#xff1f;这些问题靠通常的测试手段是无法解答的。本文介绍了Microsoft为这个目的而提供的免费工具WAS及其用法。另外&#…