c# - 如何在 C# 中将一组字符串分成它们的组成字符?

标签 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++)
{
    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++;
    }
}

最佳答案

嗯,最简单的方法是这样的:

char[] chrArr = string.Join(string.Empty, strArr).ToCharArray();

为了确保这里没有对性能特征的混淆,这里有一个在 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();

}

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

输出(以毫秒为单位):

String.Join 
765 

LINQ SelectMany 
5098 

LINQ 
5465 

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

关于c# - 如何在 C# 中将一组字符串分成它们的组成字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844986/

相关文章:

mysql - 根据特定值对记录进行排名的 SQL 语句

c# - asp.net c#中访问母版页的方法

javascript - 如何使用javascript在点击后调用方法

c# - ControlParameter 找不到 UserControl 中的控件

arrays - 在 cellForRowAtIndexPath Swift 中将 Int Array 格式化为 String

java - 我的辛普森法则计算器正确吗(java)?

c# - 如何在C#中检查LiteDB数据库文件是否有密码?

javascript - 如何找到字符串中每次出现字符的索引(Javascript)?

java - 如何解决 put(String,long) 找不到合适的方法

algorithm - 为什么 Ford-Fulkerson 算法需要后边?