Преобразование списка int в массив байтов

Я попытался использовать метод 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();
}

Ответ 1

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

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

integers.SelectMany(BitConverter.GetBytes).ToArray()

Ответ 2

Как насчет

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

полностью непроверенный BTW, но кажется разумным.

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

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

Ответ 3

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

Ответ 4

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

Предполагая, что у вас есть список int, которые действительно байтовые значения, и вы фактически не хотите, чтобы байты, необходимые для создания int, т.е. byte[][]:

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();