我的方法接收一个位置数组,该位置数组用于连接另一个数组中的某些项目。目前,我正在遍历职位并将其添加到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(",");
}
有更快的东西吗?
答案 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次尝试),因此我什至不认为这是性能下降的原因