Эффективное получение подмножеств массива
Вопрос
Есть ли эффективный способ взять подмножество массива C # и передать его другому фрагменту кода (без изменения исходного массива)? Я использую CUDA.net, у которого есть функция, которая копирует массив в графический процессор. Я хотел бы, например, передать функции десятую часть массива и, таким образом, отдельно скопировать каждую десятую часть массива в графический процессор (для целей конвейерной обработки).
Копирование массива таким способом должно быть таким же эффективным, как и копирование за один раз. Это может быть сделано с помощью небезопасного кода и просто ссылки на правильную область памяти, но кроме этого я не уверен. Функция CopyTo копирует весь массив в другой массив, так что это не выглядит полезным.
Решение
Хорошо, я бы неправильно понял вопрос раньше.
Вы хотите 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];
}