Arno, эта ссылка могла бы привести Вас к решению. Удача.
Вы можете подумать, если ваш подход к этому неправильный. Если вы обнаружите, что для этого используете рефлексию - вы уже проиграли.
Я могу придумать несколько способов приблизиться к этому, хотя какой из них идеален, во многом зависит от того, является ли это многопоточным фрагментом кода или нет.
Давайте предположим, что это не ...
Подумайте о характеристиках массива. Каждый раз, когда этот метод вызывается, создается массив N-длины. Ваша цель - повысить производительность (что означает, что вы хотите минимизировать выделение ресурсов и копирование данных).
Можете ли вы подсказать при компиляции или во время выполнения, какой идеальный начальный размер для массива? Я имею в виду - если в 95% случаев длина N равна 100 КБ или меньше ... начните с массива элементов 100 КБ. Продолжайте использовать его, пока не попадете в случай, когда массив слишком мал.
Когда вы дойдете до этого случая, вы можете решить, что вы делаете, основываясь на вашем понимании программы. Должен ли массив расти на 10%? Должен ли он расти до буквально необходимой длины? Можете ли вы использовать то, что у вас есть, и продолжить процесс для остальных данных?
Со временем будет найден идеальный размер. Вы даже можете заставить свою программу отслеживать конечный размер при каждом запуске и использовать его в качестве подсказки для выделения при следующем запуске (возможно, длина этого массива зависит от таких факторов окружающей среды, как разрешение и т. Д.).
Другими словами, я предлагаю, чтобы вы не использовали метод List-to-Array и предварительно выделяли массив, сохраняли его вечно и увеличивали его по мере необходимости.
Если в вашей программе есть проблемы с многопоточностью, вам, очевидно, нужно будет их устранить.
Поскольку вы используете GL, я предполагаю, что вы знаете, что делаете, и пропустите все предостережения. Попробуйте это или посмотрите https://stackoverflow.com/a/35588774/194921
[StructLayout(LayoutKind.Explicit)]
public struct ConvertHelper<TFrom, TTo>
where TFrom : class
where TTo : class {
[FieldOffset( 0)] public long before;
[FieldOffset( 8)] public TFrom input;
[FieldOffset(16)] public TTo output;
static public TTo Convert(TFrom thing) {
var helper = new ConvertHelper<TFrom, TTo> { input = thing };
unsafe {
long* dangerous = &helper.before;
dangerous[2] = dangerous[1]; // ie, output = input
}
var ret = helper.output;
helper.input = null;
helper.output = null;
return ret;
}
}
class PublicList<T> {
public T[] _items;
}
public static T[] GetBackingArray<T>(this List<T> list) {
return ConvertHelper<List<T>, PublicList<T>>.Convert(list)._items;
}