Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何将一组字符串划分为它们的组成字符?_C#_String_Algorithm - Fatal编程技术网

在C#中,如何将一组字符串划分为它们的组成字符?

在C#中,如何将一组字符串划分为它们的组成字符?,c#,string,algorithm,C#,String,Algorithm,将字符串数组strArr中的单个字符分隔为这些字符数组charArr的最佳方法是什么,如下所示 string[] strArr = { "123", "456", "789" }; char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 这是我目前正在做的事情,但我认为这不是很优雅: int characterCount = 0; for (int i = 0; i < strArr.Length; i++) {

将字符串数组
strArr
中的单个字符分隔为这些字符数组
charArr
的最佳方法是什么,如下所示

string[] strArr = { "123", "456", "789" };
char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
这是我目前正在做的事情,但我认为这不是很优雅:

int characterCount = 0;

for (int i = 0; i < strArr.Length; i++)
{
    characterCount += strArr[i].Length;
}

int indexCount = 0;
char[] chrArr = new char[characterCount];

for (int i = 0; i < strArr.Length; i++)
{
    for (int j = 0; j < strArr[i].Length; j++)
    {
        chrArr[indexCount] = strArr[i][j];
        indexCount++;
    }
}
int characterCount=0;
对于(int i=0;i
嗯,最简单的方法是:

char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();
为了确保这里的性能特征没有混淆,这里有一个简短的测试程序(不要忘记在右下角打开优化):

(关于性能度量代码的常见警告适用于此处,指出我犯的任何错误)

我会:

char[] chrArr = strArr.SelectMany(s => s).ToArray();

基于LINQ的版本将是:

var input = new string[] { "abc", "def", "ghi" };
var characters = (from s in input
                  from c in s
                  select c).ToArray();

foreach (var c in characters) Console.WriteLine(c);

这基本上是Jesse Slicer答案的扩展

简单地用ReSharper清理代码(如果您没有这个或类似的东西,现在就去获取它)会产生以下结果:

var characterCount = strArr.Sum(t => t.Length);

var indexCount = 0;
var chrArr = new char[characterCount];

foreach (var t1 in strArr.SelectMany(t => t))
{
    chrArr[indexCount] = t1;
    indexCount++;
}
foreach的
foreach
只是填充一个数组,已经有了一个LINQ方法
ToArray
。那么
characterCount
indexCount
就完全没有必要了

var chrArr = strArr.SelectMany(t => t).ToArray();
试试这个

 string value="";
 string[] strArr = { "123", "456", "789" }; //Your string array.

 for(int i=0;i<strArr.Length;i++)
 {
     value+=strArr[i];
 }
  char [] array=value.ToCharArray();
字符串值=”;
字符串[]strArr={“123”、“456”、“789”}//你的字符串数组。

对于(int i=0;我不敢相信这个答案得到2票赞成票,而愚蠢的一票得到14票。@I4V什么?你是什么意思?更短并不意味着更好,就最小化时间而言,我认为你实际上应该做一些性能测量,以确保这句话是正确的:)@LasseV.Karlsen哈,是的,你在测量方面没有错。:)反省一下,我希望string Join()更快,但占用更多内存。这里的“正确”没有多大意义,因为问题中的示例代码是为这个特定问题设计的,LINQ方法当然有优点,尽管我会尽可能使用
string.Join
方法,这段代码甚至可能不是一个瓶颈,因此如果LINQ方式对其他开发人员更具可读性,对每个开发人员都更具可读性。我不想说LINQ方法是错误的,但了解很多非LINQy框架代码确实是值得的,仅仅因为LINQ是“新浪潮”,并不意味着所有的旧代码都是坏的、慢的或错误的。尽管如此,我还是喜欢LINQ的例子:)@EdPlunkett我能问一下为什么没有必要使用
ToCharArray
。你说得对,我错过了。我喜欢它是因为SelectMany(),我更喜欢它而不是其他SelectMany(),因为“var”而不是char[]。请定义“适当”。一个简单的性能测试表明,我的行的排名比SelectMany行高出8倍。因为两者似乎都没有比另一个更好的具体好处(比如处理EdgeCase或其他更好的东西),如果可以的话,我会选择更快的。就我个人而言,我觉得它们在可读性方面也没有太大的不同我并不是说你错了,我只是说使用LINQ“似乎”更直观(或更惯用)。不过,请随意不同意。是的,字符串及其字符串方法确实得到了高度优化+1用于讨论中的性能测量和合理评论section@TimothyShields“直观”和“适当”都是主观的。LINQSelectMany让我查看文档以了解它,LINQ让我重读了几遍,因为非描述性变量名,而且多个来自
语句对我来说有点陌生。另一方面,我马上就明白了。从我的角度来看,如果
SelectMany
被命名为“Concat”(存在但…)或“flatte”,Linq会更直观。
var characterCount = strArr.Sum(t => t.Length);

var indexCount = 0;
var chrArr = new char[characterCount];

foreach (var t1 in strArr.SelectMany(t => t))
{
    chrArr[indexCount] = t1;
    indexCount++;
}
var chrArr = strArr.SelectMany(t => t).ToArray();
 string value="";
 string[] strArr = { "123", "456", "789" }; //Your string array.

 for(int i=0;i<strArr.Length;i++)
 {
     value+=strArr[i];
 }
  char [] array=value.ToCharArray();