如何将一组字符串分成C#中的组成字符?

Jun*_*mer 15 c# string algorithm

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

string[] strArr = { "123", "456", "789" };
char[] chrArr = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
Run Code Online (Sandbox Code Playgroud)

这就是我目前正在做的事情,但我认为它不是很优雅:

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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

ang*_*son 42

那么,最简单的方法是:

char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();
Run Code Online (Sandbox Code Playgroud)

为了确保在这里没有混淆性能特征,这里有一个在LINQPad中测试的简短程序(不要忘记打开右下角的优化):

static string[] strArr = { "123", "456", "789" };

void Main()
{
    const int iterations = 10000000; // 10 million

    // Warm up JITter
    StringJoin();
    LINQSelectMany();
    LINQ();

    Stopwatch sw = Stopwatch.StartNew();
    for (int index = 0; index < iterations; index++)
        StringJoin();
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("String.Join");

    sw.Restart();
    for (int index = 0; index < iterations; index++)
        LINQSelectMany();
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("LINQ SelectMany");

    sw.Restart();
    for (int index = 0; index < iterations; index++)
        LINQ();
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("LINQ");
}

public static void StringJoin()
{
    char[] c = string.Join(string.Empty, strArr).ToCharArray();
}

public static void LINQSelectMany()
{
    char[] c = strArr.SelectMany(s => s).ToArray();
}

public static void LINQ()
{
    var characters = (from s in strArr
                      from c in s
                      select c).ToArray();

}
Run Code Online (Sandbox Code Playgroud)

如果您想使用它,可以在此处下载此LINQPad脚本.

输出(以毫秒为单位):

String.Join 
765 

LINQ SelectMany 
5098 

LINQ 
5465 
Run Code Online (Sandbox Code Playgroud)

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

  • 请定义"适当".一个简单的性能测试表明,我的生产线比SelectMany系列高出8倍.因为它们似乎都没有提供任何特定的好处(比如处理边缘或更好),如果可以的话,我会采取更快的速度.就个人而言,我觉得它们在可读性方面也不是那么不同. (10认同)
  • 这看起来真的很傻.LINQ似乎更直观,更合适...... (2认同)
  • 是的,字符串和它们的字符串方法确实非常优化! (2认同)

Jes*_*cer 19

我会做:

char[] chrArr = strArr.SelectMany(s => s).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 我不能相信这个答案得到2个赞成票和愚蠢的14个. (4认同)
  • @ I4V怎么这么傻?我发现它非常**非常聪明. (2认同)

Dam*_*ith 7

var res = strArr.SelectMany(c => c.ToCharArray()).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 这是我最喜欢的. (2认同)