Преобразовать List<Double> в Byte[]
От: VMak  
Дата: 09.12.10 11:00
Оценка:
Добрый день всем!

Преобразование Double[] src в Byte[] dst я делаю так:

fixed( Double* pSrc = src)
{
  fixed( Byte* pDst = dst)
  {
    Byte* ps = (Byte*)pSrc;
    for(int i=0; i < dstLength; i++)
    {
      *(pDst + i) = *(ps + i);
    }
  }
}


Как такое же сделать для src типа List<Double> ?
Т.е. как получить зафиксированный указатель на
принадлежащий списку массив Double[], чтобы его
можно было явно преобразовать к указателю на Byte ?
Спасибо.
Re: Преобразовать List<Double> в Byte[]
От: vit_as Россия  
Дата: 09.12.10 11:10
Оценка:
Здравствуйте, VMak, Вы писали:

VM>Добрый день всем!


VM>Преобразование Double[] src в Byte[] dst я делаю так:


VM>
VM>fixed( Double* pSrc = src)
VM>{
VM>  fixed( Byte* pDst = dst)
VM>  {
VM>    Byte* ps = (Byte*)pSrc;
VM>    for(int i=0; i < dstLength; i++)
VM>    {
VM>      *(pDst + i) = *(ps + i);
VM>    }
VM>  }
VM>}
VM>


VM>Как такое же сделать для src типа List<Double> ?

VM>Т.е. как получить зафиксированный указатель на
VM>принадлежащий списку массив Double[], чтобы его
VM>можно было явно преобразовать к указателю на Byte ?
VM>Спасибо.

Вариант 1.
Вызвать у листа ToArray() и задача сводится к вышеупомянутой.
Вариант 2.
Использовать BitConverter для конвертирования double в byte[]
Re[2]: Преобразовать List<Double> в Byte[]
От: VMak  
Дата: 09.12.10 11:31
Оценка:
Здравствуйте, vit_as, Вы писали:

_>Вызвать у листа ToArray() и задача сводится к вышеупомянутой.


Предварительного копирования хотелось бы избежать
из соображений производительности.

Забыл сказать, что это нужно для NET 2.0
Re[3]: Преобразовать List<Double> в Byte[]
От: Spi  
Дата: 09.12.10 15:20
Оценка:
Здравствуйте, VMak, Вы писали:

VM>Здравствуйте, vit_as, Вы писали:


_>>Вызвать у листа ToArray() и задача сводится к вышеупомянутой.


VM>Предварительного копирования хотелось бы избежать

VM>из соображений производительности.

VM>Забыл сказать, что это нужно для NET 2.0


Внутри List<T> всё хранится в массиве private T[] _items; Если лист не меняется, то указатель на массив тоже сохраняется. Этот указатель можно получить через рефлексию (если это делается один раз, то на производительность не повлияет). Но вообще это изврат

А представленный ансейф код работает быстрее чем Buffer.BlockCopy?
Re[4]: Преобразовать List<Double> в Byte[]
От: VMak  
Дата: 09.12.10 15:50
Оценка:
Здравствуйте, Spi, Вы писали:

Spi>А представленный ансейф код работает быстрее чем Buffer.BlockCopy?


На самом деле для массивов я и использую BlockCopy.
Приведённый код просто поясняет что я хочу сделать
с List<Double>.
Не могли бы вы показать, как побыстрее получить
через рефлексию нужный мне указатель?
Re[5]: Преобразовать List<Double> в Byte[]
От: Spi  
Дата: 09.12.10 16:20
Оценка:
Здравствуйте, VMak, Вы писали:

VM>Здравствуйте, Spi, Вы писали:


Spi>>А представленный ансейф код работает быстрее чем Buffer.BlockCopy?


VM>На самом деле для массивов я и использую BlockCopy.

VM>Приведённый код просто поясняет что я хочу сделать
VM>с List<Double>.
VM>Не могли бы вы показать, как побыстрее получить
VM>через рефлексию нужный мне указатель?


List<int> l = new List<int>();

var f = l.GetType().GetField("_items", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Public);

var val = (int[])f.GetValue(l);


Но если будет что-то добавляться в лист, может случиться так, что ему не хватит памяти в выделенном массиве и тогда он создаёт новый массив. Соответственно ссылка будет указыватя на неиспользуемый массив.
Re[6]: Преобразовать List<Double> в Byte[]
От: VMak  
Дата: 09.12.10 16:45
Оценка:
Здравствуйте, Spi, Вы писали:

Spi>
Spi>List<int> l = new List<int>();

Spi>var f = l.GetType().GetField("_items", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Public);

Spi>var val = (int[])f.GetValue(l);
Spi>


Спасибо.
Re[5]: Преобразовать List<Double> в Byte[]
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.12.10 17:24
Оценка:
Здравствуйте, VMak, Вы писали:

VM>Не могли бы вы показать, как побыстрее получить

VM>через рефлексию нужный мне указатель?

Побыстрее будет через DynamicMethod.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.