有效地获取数组子集

本文关键字:子集 数组 获取 有效地 | 更新日期: 2023-09-27 17:48:49

有没有一种有效的方法可以获取C#数组的子集并将其传递给另一个代码集(而不修改原始数组)?我使用CUDA.net,它有一个将数组复制到GPU的功能。例如,我想将函数传递给数组的十分之一,从而将数组的每十分之一分别复制到GPU(用于流水线目的)。

以这种方式复制数组应该和一次性复制一样高效。它可以用不安全的代码和引用正确的内存位置来完成,但除此之外,我不确定。CopyTo函数会将整个数组复制到另一个数组,因此这看起来没有什么用处。

有效地获取数组子集

好吧,我以前误解了这个问题。

你想要的是系统。缓冲器区块复制或系统。大堆复制

LINQ方式的效率将非常低。如果您能够重用要复制到的缓冲区,这也将有助于提高效率,避免每次都创建新的数组——只需在顶部复制即可。除非你能把你的"大"数组平分,否则你需要一个新的数组来处理最后一种情况。

我不确定这有多有效,但。。。

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
}

您可以尝试Marshal。如果需要从字节数组转到非托管指针,请进行复制。这样可以避免自己创建不安全的代码。

编辑:这显然只有在您重新实现他们的API时才有效。抱歉-误解了。您需要一个有效的子数组方法。

我突然想到,你真正想要的是形式的原始类中的api

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

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

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