Преобразование списка целых в байтовый массив - PullRequest
11 голосов
/ 23 июня 2010

Я пытался использовать метод List.ConvertAll , но потерпел неудачу. То, что я пытаюсь сделать, это конвертировать List<Int32> в byte[]

Я ушел и пошел по этому пути, но мне нужно выяснить метод ConvertAll ...

List<Int32> integers...

internal byte[] GetBytes()
{
    List<byte> bytes = new List<byte>(integers.Count * sizeof(byte));
    foreach (Int32 integer in integers)
        bytes.AddRange(BitConverter.GetBytes(integer));

    return bytes.ToArray();
}

Ответы [ 4 ]

16 голосов
/ 23 июня 2010

Поскольку вы не хотите byte[][], где каждое целое число отображается в массив из четырех байтов, вы не можете вызвать ConvertAll. (ConvertAll не может выполнить преобразование один-ко-многим)

Вместо этого необходимо вызвать метод LINQ SelectMany, чтобы сгладить каждый байтовый массив из GetBytes в один byte[]:

integers.SelectMany(BitConverter.GetBytes).ToArray()
3 голосов
/ 23 июня 2010

Как насчет

var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();

КСТАТИ полностью не проверено, но кажется разумным.

Это на самом деле должно дать вам массив массивов байтов ... который может или не может быть тем, что вынеобходимость.Если вы хотите свернуть его в один массив, вы можете использовать SelectMany

var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
2 голосов
/ 23 июня 2010

Метод ConvertAll имеет недостатки, потому что он ожидает, что будет 1: 1 отображение от источника к месту назначения. Это не так при преобразовании целых чисел в байты. Вам гораздо лучше пойти с решением, например, предложенным @SLaks с помощью метода расширения SelectMany.

1 голос
/ 23 июня 2010

Чтобы использовать метод ConvertAll, вы можете сделать следующее ...

Предполагая, что у вас есть список целых чисел, которые на самом деле являются байтовыми значениями, и вы на самом деле не хотите, чтобы байты требовали создания целого числа, т.е.

public static class Utility {

   public static byte IntToByte(int i) {
       if(i < 0)
           return (byte)0;
       else if(i > 255)
           return (byte)255;
       else
           return System.Convert.ToByte(i);
   }
}

... конвертировать ...

byte[] array = listOfInts.ConvertAll(
                    new Converter<byte, int>(Utility.IntToByte) ).ToArray();

или вы можете использовать анонимного делегата ...

byte[] array = listOfInts.ConvertAll( new Converter<byte, int>(
                   delegate(int i) {
                       if(i < 0)
                          return (byte)0;
                       else if(i > 255)
                          return (byte)255;
                       else
                          return System.Convert.ToByte(i);
                   })).ToArray();
...