Эффективное получение подмножеств массива

Есть ли эффективный способ взять подмножество массива C# и передать его в другой кусок кода (без изменения исходного массива)? Я использую CUDA.net, у которого есть функция, которая копирует массив в графический процессор. Я хотел бы, например, передать функцию 10-й массив и, таким образом, скопировать каждый 10-й массив в графический процессор отдельно (для целей конвейерной обработки).

Копирование массива таким способом должно быть таким же эффективным, как и копирование за один раз. Это можно сделать с помощью небезопасного кода и просто ссылаясь на правильную область памяти, но кроме этого я не уверен. Функция CopyTo копирует весь массив в другой массив, так что это не выглядит полезным.

4 ответа

Решение

Хорошо, я бы неправильно понял вопрос раньше.

То, что вы хотите, это System.Buffer.BlockCopy или System.Array.Copy.

Пути 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.Copy, если вам нужно перейти от массива байтов к неуправляемому указателю. Это позволяет избежать создания небезопасного кода самостоятельно.

Изменить: Это будет ясно, только если вы переопределите их API. Извините - неправильно понял. Вы хотите эффективный метод subarray.

Мне кажется, что вы действительно хотите 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];
}
Другие вопросы по тегам