将项目数组的子集转换为字符串的最快方法?

时间:2019-05-30 16:45:39

标签: c# .net performance

我的方法接收一个位置数组,该位置数组用于连接另一个数组中的某些项目。目前,我正在遍历职位并将其添加到StringBuilder中,但是有没有更快的方法? C#是否有某种使用本机代码(类似于Java的System.arraycopy)的方法来执行更快的“循环”?

基本思路:

int[] positions = new int[] { 2, 5, 7 };
string[] values = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight" };

StringBuilder concat = new StringBuilder();

for ( int i = 0; i < positions.length; i++ )
{
    concat.Append(values[positions[i]]);
    concat.Append(",");
}

有更快的东西吗?

2 个答案:

答案 0 :(得分:0)

尝试:

int[] positions = new int[] { 2, 5, 7 };
string[] values = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight" };

var res = string.Join(",", positions.Select(f => values[f]));

答案 1 :(得分:0)

据我所知,for循环是c#中最快的循环之一,在这种情况下,您的代码无法并行执行。所以简短的答案是“不,不能更快”。

答案很长,虽然不会提高性能,但是这里不需要使用字符串构建器,您可以简单地追加而无需字符串构建器。只需将delcare concat作为字符串即可,您可以在for循环内执行类似的操作

concat += $"{values[positions[i]]},"

一件事,虽然您可能已经考虑到位置0,但在c#数组中从0开始会返回值“三”。

编辑:从用户史蒂夫(Steve)的提示中我做了一次小尝试和错误,然后我发现最快的方法就是这样做

        string concat3 = "";
        for (int i = 0; i < positions.Length; i++)
        {
            concat3 += values[positions[i]] + ", ";
        }
        Console.WriteLine(stop.ElapsedTicks);

但是我们谈论的是其中三个之间的5个滴答声(每个尝试约有20次尝试),因此我什至不认为这是性能下降的原因