Эффективное получение подмножеств массива
Есть ли эффективный способ взять подмножество массива 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];
}