`
leonardleonard
  • 浏览: 796051 次
社区版块
存档分类
最新评论

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=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()
分享到:
评论

相关推荐

    C#优化字符串操作

    【C#优化字符串操作】 1. **Convert.ToInt32 与 Int32.Parse的比较** - `Convert.ToInt32`方法在处理无法转换的字符串(如`null`)时,不会抛出异常,而是返回0。这可能导致潜在的逻辑错误,因为0可能是一个有效的...

    C#-字符串操作类

    C#-字符串操作类(替换字符串中危险字符、指定位置替换字符串、指定长度缩减字段并加...、指定字符串分割字符串、指定字符串位置获取字符串、过滤SQL中非法字符、检查SQL语句中是否有非法关键字、随机字符串生成、...

    C#中字符串操作函数

    从给定的代码片段和部分描述中,我们可以深入探讨C#中的字符串操作函数,这是C#编程语言中处理文本数据的重要方面。以下是对标题“C#中字符串操作函数”所涉及的一些关键知识点的详细说明: ### 1. 字符串截取函数 ...

    C#字符串删除指定字符串|字符串删除子字符串

    首先,C#提供了多种内置方法来操作字符串,比如`Remove`、`Replace`和`Substring`等。当我们想要删除字符串中的指定子串时,我们可以根据具体需求选择合适的方法。 1. **String.Remove方法** `Remove`方法用于移除...

    c#字符串操作方法实例

    C# 字符串操作方法实例 C# 中的字符串操作方法是指在 C# 编程语言中对字符串进行操作的各种方法和技术。字符串是使用 string 关键字声明的一个字符数组,字符串对象是“不可变的”,即它们一旦创建就无法更改。 1....

    C# 拼接字符串的几种方式和性能

    C# 拼接字符串的几种方式和性能 C# 拼接字符串的方式有多种,每种方式都有其优缺,今天我们将讨论三种常用的方式:简单“+=”拼接法、String.Format()和StringBuilder.Append()。 1. 简单“+=”拼接法 简单“+=”...

    C#判断字符串是否存在字母及字符串中字符的替换实例

    本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法。分享给大家供大家参考。具体实现方法如下: 首先要添加对命名空间“using System.Text.RegularExpressions;”的引用 下面以一个字符串为例: ...

    (c#)字符串转换成字符数组 字符串转换成int 数组

    在本篇文章中,我们将深入探讨如何在C#中将字符串转换为字符数组及整数数组。这是一项在处理文本数据时非常有用的技术,特别是在需要对数据进行解析、格式化或进一步处理的情况下。以下是对该主题的详细解释: ### ...

    C#字符串计算公式处理

    总的来说,C#字符串计算公式处理涉及字符串操作、变量解析、数值转换和数学运算。通过组合这些技术,我们可以构建出能够处理复杂计算公式的应用程序。在实际开发中,为了确保代码的健壮性和可维护性,还可以考虑引入...

    C# 字符串转十六进制串,16进制反向转回原字符串

    从十六进制串还原字符串,我们需要做相反的操作:首先将十六进制串解析为字节数组,然后将字节数组解码为字符串。C#的`Convert.FromBase64String`和`Encoding.Unicode.GetString`可以完成这一过程: ```csharp ...

    C#字符串操作与正则表达式

    在C#编程语言中,字符串操作和正则表达式是两个非常重要的概念,它们在处理文本数据时起着至关重要的作用。这篇文档“C#正则表达式.pdf”很可能是详细讲解这两个主题的教程。 首先,让我们深入了解一下C#中的字符串...

    C#常用字符串截取函数

    C#开发中经常用到一些字符串截取的函数,文档中含有大多数的函数

    c#去掉字符串中所以的空格

    在C#编程语言中,处理字符串是常见的任务之一,其中包括去除字符串中的空格。这个话题对于初学者和经验丰富的开发者都很重要,因为处理文本数据时,我们经常需要清理或格式化字符串,确保它们符合特定的需求。本文将...

    C#字符串通用操作类

    C#字符串通用操作类

    C#中字符串的格式化及转换成数值的方法

    ### C#中字符串的格式化及转换成数值的方法 在C#编程中,字符串的处理是非常常见且重要的任务之一。本文将详细介绍如何在C#中进行字符串的格式化以及如何将字符串转换为数值类型,包括整数、浮点数等。 #### 一、...

    C#将字符串数组传递给C++ DLL.rar

    C#中的字符串是引用类型,由.NET框架管理,而C++中的字符串可以是字符数组(char*)或宽字符数组(wchar_t*)。因此,传递字符串数组时,需要进行适当的类型转换。 1. **定义C++ DLL接口**: 在C++ DLL中,我们...

    C#实现移除字符串末尾指定字符的方法

    首先,我们需要了解C#中的字符串类(String),它提供了丰富的字符串操作方法。在C#中,字符串是不可变的,这意味着每次修改字符串都会创建一个新的字符串对象。因此,当我们需要移除字符串末尾的字符时,不能直接修改...

    c# 在字符串里处理重复字符

    在C#编程语言中,处理字符串中的重复字符是一项常见的任务,尤其在数据清理、文本分析或用户输入验证等场景中。本项目提供了完整的源代码,可在Visual Studio 2008环境下编译并通过测试,展现出强大的功能和扩展性。...

Global site tag (gtag.js) - Google Analytics