我有3个频道:
byte[] Red;
byte[] Green;
byte[] Blue;
我需要将它们中的所有值复制到byte[Red.Length+Green.Length+Blue.Length] PA
中,以便:
PA[0] = Red[0];
PA[1] = Green[0];
PA[2] = Blue[0];
PA[3] = Red[1];
/// and so on
以下是上述数组的示例:
byte[] Red = new byte[255];
byte[] Green = new byte[255];
byte[] Blue = new byte[255];
byte[] PA = new byte[Red.Length + Green.Length + Blue.Length];
for (int i = 0; i != 255; ++i)
{
PA[i*3 + 0] = Red[i];
PA[i*3 + 1] = Green[i];
PA[i*3 + 2] = Blue[i];
}
我假设要合并的集合具有相同的大小,并且它们之间确实有一些顺序,例如必须为“合并”集合中的项目保留[0] = Red
,[1]=Green
等。
在C#
中执行此操作的最有效方法是什么?集合不必是数组,也不必是items字节(尽管可以理解接受字节的集合类型)。
答案 0 :(得分:5)
我会尝试避免3*i
乘法:
byte[] Red = new byte[255];
byte[] Green = new byte[255];
byte[] Blue = new byte[255];
int newSize = Red.Length + Green.Length + Blue.Length;
byte[] PA = new byte[newSize];
for (int i = 0; i < newSize; i += 3)
{
PA[i + 0] = Red[i];
PA[i + 1] = Green[i];
PA[i + 2] = Blue[i];
}
修改的
甚至是类似的东西:
for (int i = 0, j = 0; i < 255; i++)
{
PA[j++] = Red[i];
PA[j++] = Green[i];
PA[j++] = Blue[i];
}
(建议Wiktor)
答案 1 :(得分:5)
我试图通过使用指针来提高效率:
unsafe {
fixed (byte* red = Red, green = Green, blue = Blue, pa = PA2) {
byte* r = red, g = green, b = blue, p = pa;
for (int i = 0; i < 255; i++) {
*p = *r; p++; r++;
*p = *g; p++; g++;
*p = *b; p++; b++;
}
}
}
在x86模式下,这大约快两倍,但在x64模式下没有区别。
总之,您拥有的代码已经足够快,适合大多数应用程序。如果你需要它非常快,你可以稍微优化它,但不是很多。
答案 2 :(得分:2)
效率是一个薄的决策层,但从性能的角度来看,我会说你已经以有效的方式做到了。
//allocate immediately memory need, so more shrinking of memory will happen
byte[] PA = new byte[Red.Length + Green.Length + Blue.Length];
//use for loop, that normally equals to foreach in some cases is faster
for (int i = 0; i != 255; ++i)
{
PA[i + 0] = Red[i];
PA[i + 1] = Green[i];
PA[i + 2] = Blue[i];
}