是否有一种有效的方法来获取C#数组的子集并将其传递给另一个代码(不修改原始数组)?我使用CUDA.net,它具有将数组复制到GPU的功能。我想,例如将函数传递给数组的第10个,从而将每个数组的第10个单独复制到GPU(用于流水线操作)。
以这种方式复制数组应该像一次复制一样高效。它可以使用不安全的代码完成,只需引用正确的内存位置,但我不确定。 CopyTo函数将整个数组复制到另一个数组,因此这看起来没用。
答案 0 :(得分:11)
好的,我以前误解了这个问题。
您想要的是System.Buffer.BlockCopy或System.Array.Copy。
LINQ方式将非常低效。如果你能够重用你正在复制的缓冲区,这也有助于提高效率,避免每次创建一个新数组 - 只需复制到顶部。除非你可以将你的“大”阵列平分,但你需要为最后一个案例添加一个新的阵列。
答案 1 :(得分:3)
我不确定这是多么有效但是......
int[] myInts = new int[100];
//Code to populate original arrray
for (int i = 0; i < myInts.Length; i += 10)
{
int[] newarray = myInts.Skip(i).Take(10).ToArray();
//Do stuff with new array
}
答案 2 :(得分:1)
如果你需要从一个字节数组转到一个非托管指针,你可以尝试使用Marshal.Copy。这样可以避免自己创建不安全的代码。
编辑:这显然只有在您重新实现其API时才有效。对不起 - 被误解了。你想要一个有效的子阵列方法。
令我感到震惊的是,你真正想要的是形式的原始类中的api
void CopyToGpu(byte[] source, int start, int length);
答案 3 :(得分:0)
您可以使用扩展方法并收益率返回:
public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
yield return array[currentIndex];
}