当前位置:编程学习 > C#/ASP.NET >>

如何将字符串转换为字符串数组?

如何将字符串转换为字符串数组?

string str = "abc";
转换为
string[] strs = {"a", "b", "c"}; --------------------编程问答-------------------- 要么在字符串里加点分隔符用split
要么循环for --------------------编程问答-------------------- String.ToCharArray --------------------编程问答-------------------- str.Split("",StringSplitOptions.RemoveEmptyEntries); --------------------编程问答--------------------
引用 2 楼 liherun 的回复:
String.ToCharArray

这个可以 --------------------编程问答--------------------
        /// <summary>
        /// string转string[]
        /// </summary>
        /// <param name="str">待转换字符串</param>
        /// <returns>字符串数组</returns>
        public static string[] StrToArray(string str)
        {
            string[] str_array = new string[str.Length];
            for (int cnt = 0; cnt < str.Length; cnt++)
            {
                str_array[cnt] = str[cnt];
            }
            return str_array;
        }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 5 楼 sleep0110 的回复:
C# code///<summary>/// string转string[]///</summary>///<param name="str">待转换字符串</param>///<returns>字符串数组</returns>publicstaticstring[] StrToArray(string str)
        {string[] str_array=newstring[str.L?-


这种方法能实现,还没找到更简单的. --------------------编程问答-------------------- String.Split(_) --------------------编程问答-------------------- string[] strs = Regex.Split(str, "(?<=.)(?=.)");

using System;
using System.Text.RegularExpressions;

class Program
{
  static void Main()
  {
    string str = "abc"; 
    string[] strs = Regex.Split(str, "(?<=.)(?=.)");
    foreach (string s in strs)
    {
      Console.WriteLine("[{0}]", s);
    }
  }
}
/* 程序输出:
[a]
[b]
[c]
*/
--------------------编程问答-------------------- 这样也可以:
string[] strs = System.Text.RegularExpressions.Regex.Split(str, "(?!^|$)");

        
--------------------编程问答--------------------

            
  /// <summary>
        /// 按指定字数分割字符串
        /// </summary>
        /// <param name="str">待分割字符串</param>
        /// <param name="number">字数</param>
        /// <returns>返回分割后的字符串</returns>
        public static string[] SplitByNumberWords(String str, int number)
        {
            string[] strSplit = null;
            int length = str.Length;
            if (length > number)
            {
                //需要分割的字符串数组长度,有余数时总长度要加一
                strSplit = new string[(int)length / number + (length % number > 0 ? 1 : 0)];

                for (int i = 0; i < strSplit.Length;i++ )
                {
                    if ((i + 1) == strSplit.Length && (length % number) > 0)
                    {
                        //最后一截字符串
                        strSplit[i] = str.Substring(i * number, length % number);
                    }else
                    {
                        strSplit[i] = str.Substring(i * number, number);
                    }
                }
            }else
            {
                //长度小于自定字符数
                strSplit = new string[1];
                strSplit[0] = str;
            }


            return strSplit;
        }
--------------------编程问答-------------------- ToCharArray  --------------------编程问答--------------------
引用 2 楼 liherun 的回复:
String.ToCharArray


简单实用! --------------------编程问答-------------------- 楼主要的肯定是制定字数的。
也就是说“ABCDEFGH”=》A,B,C,D,E,F,G,H 或者AB,CD,EF,GH
用我的方法SplitByNumberWords("string",切割后lengs) --------------------编程问答--------------------
引用 13 楼 jiasongmao850306 的回复:
引用 2 楼 liherun 的回复:
String.ToCharArray
简单实用!


注意: 结果要的是 string[] , 不是char[] --------------------编程问答--------------------
引用 2 楼 liherun 的回复:
String.ToCharArray

这个好
--------------------编程问答--------------------
引用 14 楼 javc 的回复:
楼主要的肯定是制定字数的。
也就是说“ABCDEFGH”=》A,B,C,D,E,F,G,H 或者AB,CD,EF,GH
用我的方法SplitByNumberWords("string",切割后lengs)


这个只有一行语句:
return Regex.Split(s, string.Format("(?<=^(?:.{{{0}}})+)", n));

using System;
using System.Text.RegularExpressions;

class Program
{
  static void Main()
  {
    string str = "abcdefghijklmnopqrstuvwxyz";
    string[] strs = SplitByNumberWords(str, 5); 
    foreach (string s in strs)
    {
      Console.WriteLine("[{0}]", s);
    }
  }
  
  static string[] SplitByNumberWords(string s, int n)
  {
    return Regex.Split(s, string.Format("(?<=^(?:.{{{0}}})+)", n));
  }

}
/* 程序输出:
[abcde]
[fghij]
[klmno]
[pqrst]
[uvwxy]
[z]
*/
--------------------编程问答--------------------
引用 10 楼 wuyi8808 的回复:
这样也可以:
C# codestring[] strs= System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)");


9楼的方式早就知道了,10楼这个受教了 --------------------编程问答-------------------- String.ToCharArray  确实可以 --------------------编程问答-------------------- wuyi8808 :
谢了谢了,受教了。
俺就没想到过正值,哈哈! --------------------编程问答--------------------
引用 19 楼 lym_meimei 的回复:
String.ToCharArray  确实可以


请看清楚题目。

注意,LZ要求返回的是 string[],而不是 char[]。
--------------------编程问答--------------------
引用 10 楼 wuyi8808 的回复:
这样也可以:
C# codestring[] strs= System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)");


赞 --------------------编程问答-------------------- 改进一下17楼的程序,加上“(?!$)”,以去除可能的最后一个空字符串:
  static string[] SplitByNumberWords(string s, int n)
  {
    return Regex.Split(s, string.Format("(?!$)(?<=^(?:.{{{0}}})+)", n));
  }
--------------------编程问答-------------------- dd --------------------编程问答-------------------- 这种Google 一把一大堆的东西也是精华。。。。床上等你越来越不行了。 --------------------编程问答--------------------
引用 2 楼 liherun 的回复:
String.ToCharArray


正解。 --------------------编程问答--------------------
引用 26 楼 songsu 的回复:
引用 2 楼 liherun 的回复:
String.ToCharArray


正解。



这还叫正解?

new string(str.ToCharArray())还差不多 --------------------编程问答--------------------

            string s = "abcdefghijklmwwsa2321rw@1124^&*";
            int n = s.Length ;
            for (int i = 0; i < n; i++)
            {
                s=s.Insert(2*i+1, ",");
            }
            s = s.Remove(s.Length - 1);//去掉最后一个","号
            string[] res = s.Split(',');
--------------------编程问答-------------------- 神奇啊!!!!!!!!!!! --------------------编程问答--------------------
引用 26 楼 songsu 的回复:
引用 2 楼 liherun 的回复:
 String.ToCharArray


 正解。

大哥们,你们就不能先看看书,先看看语法说明?就跑来正解误解的。 --------------------编程问答-------------------- jf --------------------编程问答--------------------
你们都是觉得写得短和难读才算牛吗?

这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了,还加精。真是无语。。。

--------------------编程问答-------------------- 不知道啊啊啊啊 --------------------编程问答-------------------- Mark! --------------------编程问答-------------------- #include <string>
#include <iostream>
using namespace std;
int main()
{
size_t i=0,j=0;
int number=0;
string str1 ="10.7.93.25";
string str2 = ".";
string result[4];
for(;((j=str1.find(str2,i))!=string::npos);i=j)
{
result[number]=str1.substr(i,j-i);
j=j+str2.size();
++number;
}
result[number]=str1.substr(i);
cout<<result[0]<<endl;
cout<<result[1]<<endl;
cout<<result[2]<<endl;
cout<<result[3]<<endl;
return 0;
}

http://www.Lookxin.cn IT资讯网
--------------------编程问答--------------------  感想颇多!都用了自己的方式,都有自己的特点

方式一:
String.ToCharArray

这个方式很好,而且简单明了,比较实用,但是返回值是char数组,如果使用的处理函数是string数组,需要处理或转换一下,但也不失为一种好方法

方式二:
就是自己写代码的方式,利用循环和其他的一些方式,利用自己写的逻辑进行处理。这种方式,也可以实现,而且能比较灵活的实现,而且能够随心所欲。但是如果分隔的方式不是需要太多变化的话,还是推荐使用类库,这样比较能节省大家的工作量

方式三:
使用正则表达是,这个方式很好!而且应该有很高的效率。而且逻辑简单清晰。但是就是,不是所有人都熟悉这正则表达式!但是这个方式确实很好! --------------------编程问答-------------------- String.ToCharArray 
--------------------编程问答-------------------- 大学问啊。
String.ToCharArray --------------------编程问答-------------------- 这个有必要讨论吗 --------------------编程问答-------------------- 路过 --------------------编程问答-------------------- 直接套用的。。 --------------------编程问答--------------------
引用 36 楼 pldotnet 的回复:
感想颇多!都用了自己的方式,都有自己的特点

方式一:
C# codeString.ToCharArray
这个方式很好,而且简单明了,比较实用,但是返回值是char数组,如果使用的处理函数是string数组,需要处理或转换一下,但也不失为一种好方法

方式二:
就是自己写代码的方式,利用循环和其他的一些方式,利用自己写的逻辑进行处理。这种方式,也可以实现,而且能比较灵活的实现,而且能够随心所欲。但是如果分隔的方式不是需要太多变化的话,还是推荐使用类库,这样比较能节省大家的工作量

方式三:
使用正则表达是,这个方式很好!而且应该有很高的效率。而且逻辑简单清晰。但是就是,不是所有人都熟悉这正则表达式!但是这个方式确实很好!


总结的不错
···
这个最好还是自己写个函数,毕竟模板里的函数代码效率不一定有我们自己写的单一用处的快,因为往往模板代码要考虑的十分周全,而我们只需要写自己要的就行了 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 用Split()就可以了 --------------------编程问答-------------------- String.ToCharArray 可以 
split也行 --------------------编程问答-------------------- String.ToCharArray 可以 
split也行
呵呵,试试 --------------------编程问答--------------------

String str="abc";
     String s[]=new String[str.length()];
     for(int i=0;i<str.length();i++){
     s[i]=""+str.charAt(i);
     System.out.println(s[i]);
     }

虽然方法不算好,还比较简便 --------------------编程问答-------------------- 顶顶顶顶顶顶顶顶顶顶。 --------------------编程问答-------------------- 学习了,的确不错。
一般都用指针++吧 --------------------编程问答-------------------- 方法真是 多多。。。。。。。。。。。。。。。。 --------------------编程问答-------------------- String.Split(_) OR FOR(){} --------------------编程问答-------------------- 不错,挺好的啊
String str="abc";
        String s[]=new String[str.length()];
        for(int i=0;i<str.length();i++){
            s[i]=""+str.charAt(i);
            System.out.println(s[i]);
        }
--------------------编程问答--------------------
引用 32 楼 0009 的回复:
你们都是觉得写得短和难读才算牛吗?

这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了,还加精。真是无语。。。


真是无语,new string(char, int) 能转化为 string[] 吗?

new string(...) 是 string 的构造函数,得到的只能是 string,不可能是 string[]。
--------------------编程问答--------------------
引用 53 楼 wuyi8808 的回复:
引用 32 楼 0009 的回复:
 你们都是觉得写得短和难读才算牛吗?

 这个问题本来就将char[]数组简单地用new string(char, int) 转化为string[]就OK了,还加精。真是无语。。。




 真是无语,new string(char, int) 能转化为 string[] 吗?

 new string(...) 是 string 的构造函数,得到的只能是 string,不可能是 string[]。


ok,我说得不够清楚。

我说的是用string的构造方法将char转为string,这中间需要一个循环,比如for,将每一个char进行一次转换最后得到一个string[]数组,这会多出来几行代码,但是效率和可读性绝对是强壮的。

这些都是细枝末节了,需要一定说得那么清楚吗?我只是想说这么简单的问题,大家不要写得那么晦涩,而且还加精,这样只会带来一些不好的风气,实事上CSDN上现在很多帖子都是这样子。技巧要用在它真正需要存在的地方,那才叫做技巧。
--------------------编程问答-------------------- 顶起来……,学习了顶起来……,学习了顶起来……,学习了顶起来……,学习了 --------------------编程问答-------------------- 方法多种多样啊
留个记号了 --------------------编程问答--------------------
引用 楼主 的回复:
如何将字符串转换为字符串数组? 
如      string   str  = "abc"; 

转换为  string[] strs = {"a", "b", "c"};
引用 32 楼 0009 的回复:
你们都是觉得写得短和难读才算牛吗?

这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了,还加精。真是无语。。。
引用 54 楼 0009 的回复:
我说的是用string的构造方法将char转为string,这中间需要一个循环,比如for,将每一个char进行一次转换最后得到一个string[]数组,这会多出来几行代码,但是效率和可读性绝对是强壮的。

这些都是细枝末节了,需要一定说得那么清楚吗?我只是想说这么简单的问题,大家不要写得那么晦涩,而且还加精,这样只会带来一些不好的风气,实事上CSDN上现在很多帖子都是这样子。技巧要用在它真正需要存在的地方,那才叫做技巧。
--------------------编程问答-------------------- 哈哈。学习了,谢谢楼主了 --------------------编程问答-------------------- 呵呵,我就打得快一点,言语上没有说清楚,但是我相信这种细技末节的代码没有几人不会的吧?这不是我说的重点。

我想说的重点是不要宣传这种卖弄技巧的风气。程序还是应该追求可读性,强壮性和效率。 --------------------编程问答--------------------
引用 54 楼 0009 的回复:
我说的是用string的构造方法将char转为string,这中间需要一个循环,比如for,将每一个char进行一次转换最后得到一个string[]数组,这会多出来几行代码,但是效率和可读性绝对是强壮的。


难道下面这行语句的效率和可读性不是强壮的?真正学懂正则的程序员理解"(?!^|$)"有困难吗?

引用 10 楼 wuyi8808 的回复:
这样也可以:
string[] strs= System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)");
--------------------编程问答-------------------- 这个问题本来就将char[]数组简单地用 new string(char, int) 转化为string[]就OK了

----

其实说实话,这句话我也觉得没什么不妥的,只是没说细节,但是实现重点说了。难道非得把一个For或者把一个Select(Linq)写出来大家才能看懂吗? --------------------编程问答--------------------
引用 59 楼 0009 的回复:
程序还是应该追求可读性,强壮性和效率。


严重同意!

但"(?!^|$)"没有“可读性,强壮性和效率”?

请学过正则的程序员投票吧! --------------------编程问答-------------------- String.toCharArray() --------------------编程问答--------------------
while (*t++ = *s++);

请问上面这行代码有没有“可读性,强壮性和效率”?  --------------------编程问答--------------------
引用 2 楼 liherun 的回复:
String.ToCharArray


而且效率最高 --------------------编程问答--------------------
引用 60 楼 wuyi8808 的回复:
引用 54 楼 0009 的回复:
我说的是用string的构造方法将char转为string,这中间需要一个循环,比如for,将每一个char进行一次转换最后得到一个string[]数组,这会多出来几行代码,但是效率和可读性绝对是强壮的。

 难道下面这行语句的效率和可读性不是强壮的?真正学懂正则的程序员理解"(?!^|$)"有困难吗?

引用 10 楼 wuyi8808 的回复:
这样也可以:
string[] strs= System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)");


先不论正则的效率,就是单这个?!^|$,你觉得每个人都有你这么厉害吗哈哈。为什么不System.Text.RegularExpressions.Regex.Split(str,"");呢,为什么这里要排除掉“开始”和“结束”呢。你真的打从心底认为这个可读性很强?? --------------------编程问答--------------------
引用 65 楼 teng_s2000 的回复:
引用 2 楼 liherun 的回复:String.ToCharArray

而且效率最高


哪个效率最高必须有测试数据的支持才行,不是口头上说说就行的。 --------------------编程问答-------------------- 真正学懂正则的程序员会不知道(?!)的用法? --------------------编程问答--------------------
引用 65 楼 teng_s2000 的回复:
引用 2 楼 liherun 的回复:String.ToCharArray

而且效率最高


到目前的楼层为止,我还没有看到一个完整而正确的 String.ToCharArray 版的程序。

请先动手写出程序来(当然,这个程序非常容易写,但我就还没看到谁动手写得正确的),然后,才能写程序比较各种方法的效率。

没有实际的程序就,就先别奢谈效率最高了。 --------------------编程问答--------------------
引用 68 楼 wuyi8808 的回复:
真正学懂正则的程序员会不知道(?!)的用法?

System.Text.RegularExpressions.Regex.Split(str,"");
相比较于
System.Text.RegularExpressions.Regex.Split(str,"(?!^|$)"); 
会将头尾的的空字符串分配进去。
而?!^|$(实际上应该是?<!^|?!$更好理解)将这种情况排除在外。
我要表达的意思也说完了,该解释的也解释完了,可能我们对这个问题认识的尺度不一样,那么OK,仁者见仁,智者见智。 --------------------编程问答-------------------- 既然没有人愿意动手写 String.ToCharArray 版的程序,那就我写一个吧:
(大家还有改进意见吗?)

using System;

class Program
{
  static void Main()
  {
    string str = "abc";
    string[] strs = Split(str);

    foreach (string s in strs)
    {
      Console.WriteLine("[{0}]", s);
    }
  }
  
  static string[] Split(string s)
  {
    char[] c = s.ToCharArray();
    string[] strs = new string[c.Length];
    for (int i = 0; i < c.Length; i++)
    {
      strs[i] = new string(c[i], 1);
    }
    return strs;
  }
}
--------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答--------------------
引用 70 楼 0009 的回复:
而?!^|$(实际上应该是?<!^|?!$更好理解)
/*
这里需要澄清一下,
"(?!^|$)" 已经很好理解了,
如果非要分开写的话,应该是: "(?!^)(?!$)",
而不是:"(?<!^)|(?!$)"。

首先,(?<!^) 没道理,这里不应该用逆序环视的,
其次,逻辑上也不是“或”的关系,不应该用“|”。

无论是 "(?<!^)|(?!$)",还是 "(?!^)|(?!$)",
都不会得到正确的结果。
*/
--------------------编程问答-------------------- 说到 String.ToCharArray 版的程序(参见71楼,或者还有哪位愿意写个更好的程序?)
我想了一下,完全没有必要用 String.ToCharArray,直接用 s[i] 就很好了,
何必 String.ToCharArray 多此一举呢?

(请各位程序员发表高见)
 
  static string[] Split(string s)
  {
    string[] strs = new string[s.Length];
    for (int i = 0; i < s.Length; i++)
    {
      strs[i] = new string(s[i], 1);
    }
    return strs;
  }
}
--------------------编程问答-------------------- 综上所述,就我看来,String.ToCharArray 完全是多此一举,根据75楼的程序,压根儿就没有必要用 String.ToCharArray,那些说 String.ToCharArray 正解的程序员是不是应该多思考一下呢? --------------------编程问答--------------------
引用 74 楼 wuyi8808 的回复:
引用 70 楼 0009 的回复:
而?!^|$(实际上应该是?<!^|?!$更好理解)C# code/*
这里需要澄清一下,
"(?!^|$)" 已经很好理解了,
如果非要分开写的话,应该是: "(?!^)(?!$)",
而不是:"(?<!^)|(?!$)"。

首先,(?<!^) 没道理,这里不应该用逆序环视的,
其次,逻辑上也不是“或”的关系,不应该用“|”。

无论是 "(?<!^)|(?!$)",还是 "(?!^)|(?!$)",
都不会得到正确的结果。*/


谢谢更正,刚才我是随手打的,没有测试,我想说的是应该用 (?<!^)(?!$) 更好理解,含义为 前面不为“开始”,后面不为”结束“ --------------------编程问答--------------------
引用 76 楼 wuyi8808 的回复:
综上所述,就我看来,String.ToCharArray 完全是多此一举,根据75楼的程序,压根儿就没有必要用 String.ToCharArray,那些说 String.ToCharArray 正解的程序员是不是应该多思考一下呢?


String.ToCharArray应该比直接引用string的索引器要快,当然这只是我一直以来对string[]这个索引器的印象,并没有做过深入测试,所以我前面才会提到ToCharArray而不是string[]索引器。 --------------------编程问答-------------------- (?!^)(?!$) 也是可以的,意思是:“不是行首,也不是行末”
(?!^|$) 的意思是:“不是行首或行末”,很容易理解的。
--------------------编程问答--------------------    char[] c = s.ToCharArray();
多声明了一个 char[],需要申请空间,应该比直接用 s[i] 慢,这是我的感觉,未经测试。 --------------------编程问答-------------------- DDDDDDDDDDDDDDDDDDDDDDDD --------------------编程问答--------------------
引用 79 楼 wuyi8808 的回复:
(?!^)(?!$) 也是可以的,意思是:“不是行首,也不是行末”
 (?!^|$) 的意思是:“不是行首或行末”,很容易理解的。


1. 首先你用“行首”,“行末”的术语比我用的“开始”“结束”好听点,哈哈。
2. ?!或?= 带有“向后断言”的意思,?<!和?<=带有“往前断言”的意思,我是从这个角度出发才认为(?<!^)(?!$)更好理解

最后想说一点是,版主貌似比我还认真执着哈哈,程序员都这样~~

不过说到后面就已经是跑题了

--------------------编程问答-------------------- 当然,71楼的程序仅仅是我写的 String.ToCharArray 版的程序,个人之见,不能代表 String.ToCharArray 派程序员的真正水平和效率。

我所以写71楼的和程序,是因为我看到各位程序员大谈 String.ToCharArray,而没有人愿意写出一个可以正确解答 LZ 总是的 String.ToCharArray 版的程序,随手就写了一个。

如果各位程序员对 String.ToCharArray 有更深刻的理解,写出更好的 String.ToCharArray 版的程序,非常欢迎贴出来讨论。 --------------------编程问答-------------------- 吃饭去了,回头再来看贴。 --------------------编程问答-------------------- 没看见linq的,补个linq的:
        static string[] Fun(string str)
        {
            return (from c in str select c.ToString()).ToArray();
        }
见笑了 --------------------编程问答-------------------- 写得好。1. 首先你用“行首”,“行末”的术语比我用的“开始”“结束”好听点,哈哈。 
2. ?!或?= 带有“向后断言”的意思,? <!和? <=带有“往前断言”的意思,我是从这个角度出发才认为(? <!^)(?!$)更好理解 

最后想说一点是,版主貌似比我还认真执着哈哈,程序员都这样~~ 

不过说到后面就已经是跑题了  --------------------编程问答-------------------- 这种问题永远都是回复数最高,高手也最爱回复的问题! --------------------编程问答-------------------- 测试代码:
class Program
{
    static void Main(string[] args)
    {
        Random random = new Random();
        int count = 10000000;
        char[] chars = new char[count];
        for (int i = 0; i < chars.Length; i++)
        {
            chars[i] = (char)random.Next(65, 91);
        }
        string s = new string(chars);
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        Split_Regex(s);
        stopwatch.Stop();
        Console.WriteLine("Split_Regex: {0:N0}", stopwatch.ElapsedTicks);

        stopwatch.Reset();
        stopwatch.Start();
        Split_StringIndexer(s);
        stopwatch.Stop();
        Console.WriteLine("Split_StringIndexer: {0:N0}", stopwatch.ElapsedTicks);

        stopwatch.Reset();
        stopwatch.Start();
        Split_ToCharArray(s);
        stopwatch.Stop();
        Console.WriteLine("Split_ToCharArray: {0:N0}", stopwatch.ElapsedTicks);

        stopwatch.Reset();
        stopwatch.Start();
        Split_Linq(s);
        stopwatch.Stop();
        Console.WriteLine("Split_Linq: {0:N0}", stopwatch.ElapsedTicks);

        Console.ReadKey();
    }

    static Regex _regex = new Regex("(?!^|$)", RegexOptions.Compiled);

    static string[] Split_Regex(string s)
    {
        return _regex.Split(s);
    }

    static string[] Split_StringIndexer(string s)
    {
        string[] strs = new string[s.Length];
        for (int i = 0; i < s.Length; i++)
        {
            strs[i] = new string(s[i], 1);
        }
        return strs;
    }

    static string[] Split_ToCharArray(string s)
    {
        char[] chars = s.ToCharArray();
        string[] strs = new string[s.Length];
        for (int i = 0; i < s.Length; i++)
        {
            strs[i] = new string(chars[i], 1);
        }
        return strs;
    }

    static string[] Split_Linq(string s)
    {
        return (from c in s select c.ToString()).ToArray();
    }
}


测试结果:

Split_Regex: 191,903,432
Split_StringIndexer: 48,318,578
Split_ToCharArray: 43,770,727
Split_Linq: 62,211,450

ToCharArray方法和StringIndexer方法的性能接近,Linq方法次之,Regex方法速度明显落后。

而且,我始终认为,Regex 方法的可读性是最差的!


--------------------编程问答-------------------- 排版不好,重新发一遍:

Split_Regex: 191,903,432 
Split_StringIndexer: 48,318,578 
Split_ToCharArray: 43,770,727 
Split_Linq: 62,211,450  --------------------编程问答-------------------- 。。。。。。

换行怎么没了?!

Split_Regex: 191,903,432
Split_StringIndexer: 48,318,578
Split_ToCharArray: 43,770,727
Split_Linq: 62,211,450  --------------------编程问答-------------------- 目前测试此方法最快:
        static string[] Fun3(string str)
        {
            int length = str.Length;
            string[] result = new string[length];
            for(int index = 0;index < length;index++)
            {
                result[index] = str[index].ToString();
                index++;
            }
            return result;
        }
--------------------编程问答-------------------- Sorry,ToCharArray方法应该更正一下,更正后速度能够再快一些,速度会稍微明显地优于String索引器方法(因为编译器的优化)。

static string[] Split_ToCharArray(string s)
{
    char[] chars = s.ToCharArray();
    string[] strs = new string[s.Length];
    for (int i = 0; i < chars.Length; i++)
    {
        strs[i] = new string(chars[i], 1);
    }
    return strs;
}
--------------------编程问答--------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;

namespace Test
{
    static class Program
    {
        static void Main()
        {
            Random random = new Random();
            int count = 10000000;
            char[] chars = new char[count];
            for(int i = 0;i < chars.Length;i++)
            {
                chars[i] = (char)random.Next(65, 91);
            }
            string s = new string(chars);
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            Fun1(s);
            stopwatch.Stop();
            Console.WriteLine("Fun1: {0:N0}", stopwatch.ElapsedTicks);

            stopwatch.Reset();
            stopwatch.Start();
            Fun2(s);
            stopwatch.Stop();
            Console.WriteLine("Fun2: {0:N0}", stopwatch.ElapsedTicks);

            stopwatch.Reset();
            stopwatch.Start();
            Fun3(s);
            stopwatch.Stop();
            Console.WriteLine("Fun3: {0:N0}", stopwatch.ElapsedTicks);

            stopwatch.Reset();
            stopwatch.Start();
            Fun4(s);
            stopwatch.Stop();
            Console.WriteLine("Fun4: {0:N0}", stopwatch.ElapsedTicks);

            stopwatch.Reset();
            stopwatch.Start();
            Split_ToCharArray(s);
            stopwatch.Stop();
            Console.WriteLine("Split_ToCharArray: {0:N0}", stopwatch.ElapsedTicks);

            Console.ReadKey();
        }

        static string[] Fun1(string str)
        {
            return (from c in str select c.ToString()).ToArray();
        }
        static string[] Fun2(string str)
        {
            return (from c in str select new string(c, 1)).ToArray();
        }
        static string[] Fun3(string str)
        {
            int length = str.Length;
            string[] result = new string[length];
            for(int index = 0;index < length;index++)
            {
                result[index] = str[index].ToString();
                index++;
            }
            return result;
        }
        static string[] Fun4(string str)
        {
            int length = str.Length;
            string[] result = new string[length];
            for(int index = 0;index < length;index++)
            {
                result[index] = new string(str[index], 1);
                index++;
            }
            return result;
        }
        static string[] Split_ToCharArray(string s)
        {
            char[] chars = s.ToCharArray();
            string[] strs = new string[s.Length];
            for(int i = 0;i < chars.Length;i++)
            {
                strs[i] = new string(chars[i], 1);
            }
            return strs;
        }
    }
}


Fun1: 6,735,521,718
Fun2: 7,073,163,153
Fun3: 2,774,066,976
Fun4: 2,969,522,136
Split_ToCharArray: 5,301,748,944
--------------------编程问答--------------------
引用 15 楼 lzsh0622 的回复:
引用 13 楼 jiasongmao850306 的回复:引用 2 楼 liherun 的回复: String.ToCharArray 简单实用!

注意: 结果要的是 string[] , 不是char[]


你再.ToString()撒...简单实用额... --------------------编程问答--------------------
引用 93 楼 aimeast 的回复:
...
        static string[] Fun3(string str)
        {
            int length = str.Length;
            string[] result = new string[length];
            for(int index = 0;index < length;index++)
            {
                result[index] = str[index].ToString();
                index++;
            }
            return result;
        }
        static string[] Fun4(string str)
        {
            int length = str.Length;
            string[] result = new string[length];
            for(int index = 0;index < length;index++)
            {
                result[index] = new string(str[index], 1);
                index++;
            }
            return result;
        }

...


这两个方法都有问题,循环体内的 index++; 应该去掉。

--------------------编程问答-------------------- 你的Fun3和Fun4有问题 --------------------编程问答--------------------
引用 96 楼 0009 的回复:
你的Fun3和Fun4有问题
请指教 --------------------编程问答--------------------
引用 97 楼 aimeast 的回复:
引用 96 楼 0009 的回复:
你的Fun3和Fun4有问题请指教
发现了,多敲了个index++。自己太粗心了。谢谢! --------------------编程问答-------------------- 我运行了88楼的测试程序,发现确实是 Regex 版本最慢。

但 Split_StringIndexer 和 Split_ToCharArray 这两个版本的运行速度似乎和运行的先后次序有很大的关系,不知是为什么。

测试例子随后贴出。 --------------------编程问答--------------------
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

class Program
{
  static void Main()
  {
    Random random = new Random();
    int count = 100000;
    char[] chars = new char[count];
    for (int i = 0; i < chars.Length; i++)
    {
      chars[i] = (char)random.Next(65, 91);
    }
    string s = new string(chars);
    
    Stopwatch stopwatch = new Stopwatch();

    stopwatch.Reset();
    stopwatch.Start();
    Split_StringIndexer(s);
    stopwatch.Stop();
    Console.WriteLine("Split_StringIndexer: {0,20:N0}", stopwatch.ElapsedTicks);

    stopwatch.Reset();
    stopwatch.Start();
    Split_ToCharArray(s);
    stopwatch.Stop();
    Console.WriteLine("  Split_ToCharArray: {0,20:N0}", stopwatch.ElapsedTicks);
  }

  static string[] Split_StringIndexer(string s)
  {
    string[] strs = new string[s.Length];
    for (int i = 0; i < s.Length; i++)
    {
      strs[i] = new string(s[i], 1);
    }
    return strs;
  }

  static string[] Split_ToCharArray(string s)
  {
    char[] chars = s.ToCharArray();
    string[] strs = new string[s.Length];
    for (int i = 0; i < s.Length; i++)
    {
      strs[i] = new string(chars[i], 1);
    }
    return strs;
  }
}

/* 在我的机器上的某次运行结果:
Split_StringIndexer:           10,970,659
  Split_ToCharArray:           31,380,433
*/
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,