高效地获取数组子集

jquia 发布于 2018-05-20 arrays 最后更新 2018-05-20 21:24 148 浏览

有没有一种有效的方法来获取C#数组的一个子集并将其传递给另一个代码片段(而不需要修改原始数组)?我使用CUDA.net,它具有将阵列复制到GPU的功能。我想例如将函数传递给数组的第10个元素,从而将数组的每个第10个元素单独复制到GPU(用于流水线目的)。 以这种方式复制数组应该像复制一样高效。它可以用不安全的代码完成,只需引用正确的内存位置,但除此之外我不确定。 CopyTo函数将整个数组复制到另一个数组,因此这看起来不太有用。

已邀请:

gut

赞同来自:

我不确定这是多高效,但...

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
}

xnobis

赞同来自:

您可以使用扩展方法并返回收益:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}

tet

赞同来自:

好的,我以前误解了这个问题。 你想要的是System.Buffer.BlockCopySystem.Array.Copy。 LINQ的方式将会非常低效。如果你能够重用你复制的缓冲区,这也将有助于提高效率,避免每次创建一个新的数组 - 只需复制顶部。除非你可以平分你的“大”阵列,否则你将需要一个新的最后一个案例。

nin

赞同来自:

如果你需要从一个字节数组到一个非托管指针,你可以尝试Marshal.Copy。这可以避免自己创建不安全的代码。 编辑:这显然只适用于你重新实现他们的API。对不起 - 误解了。你想要一个有效的子数组方法。 它让我感到你真正想要的是在表单的原始类中的api

void CopyToGpu(byte[] source, int start, int length);