Получить массив списка и сохранить ссылку?C#

Место общения программистов C#
Ответить
Anonymous
 Получить массив списка и сохранить ссылку?

Сообщение Anonymous »

По причинам производительности я хочу получить массив List непосредственно в C#
https://referencesource.microsoft.com/# ... neric/list. cs,2765070d40f47b98
Мой код здесь:

Код: Выделить всё

private UIVertex[] GetArray(List verts)
{
var aryF = typeof(List).GetField("_items", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
return aryF.GetValue(verts) as UIVertex[];
}

private void SetSize(List list, int size)
{
sizeF = typeof(List).GetField("_size",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
}

static List verts
static UIVertex[] ary;
//...
ary = GetArray(verts);
< /code>
В моем случае я могу повторно использовать «Verts», но когда изменение Verts Count. Моему нужно снова получить снова (и это вызововое отражение), < /p>
Стоимость отражения слишком высота, могу ли я просто сохранить ссылку? Как это сделать? String.memcpy () < /code>, это слишком медленно, поэтому я хочу напрямую использовать массив. Я могу просто сохранить это, чтобы быть быстрым. < /P>
ps 2.static List Orgin = new List(128);
void DO() // *it call a lot of times.*
{
GetListByAPI(Orgin);// here is API , So it must insert List.
int Size = Orgin.Count() * 5; // size is unchanged in here.
if(Orgin.Capacity < Size)
{
Orgin.Capacity = Size;
}
for(int i = Orgin.Count() ; i < Size ;i++)
{
T t
Orgin.Add(t);// I need "Oring.Count() * 5 " Size Array for my logic.
//...
}
}
< /code>
Здесь изменяется после: < /p>
static List Orgin = new List(128);
static T[] StaticAry;
void DO() // *it call a lot of times.*
{
bool LastOringCapacity = Orgin.Capacity;
GetListByAPI(Orgin);// here is API , So it must insert List.

bool arrayRefChanged = Orgin.Capacity > LastOringCapacity ; // I Can know it. and get array again.

int Size = Orgin.Count() * 5; // size is unchanged in here.
SetSize(Oring, Size);//here set array legth of list by refection
StaticAry = GetArray(Orgin);//here I get array of list by reflection

for(int i = 0 ; i < size; i++)
{
T t = StaticAry[i];//just use it , avoid to use List.Add api.
//....
}
}
< /code>
Этот статический оргин повторно используется, поэтому oring.capacity может не измениться. Таким образом, массив Оргина тоже не изменяется. И я хочу получить массив. напрямую используйте его.
, но сейчас. Мне нужно использовать отражение, чтобы получить массив в каждом отдельном do (). < /P>
Место сложности - это то, что
List.Capacity
& Array.Length и List.Count() — это три разных значения.

Подробнее здесь: https://stackoverflow.com/questions/640 ... -reference
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»