Я пытался использовать Список. Метод ConvertAll и отказавший. То, что я пытаюсь сделать, является преобразованием a List
кому: byte[]
Я схватил и пошел этим путем, но я должен выяснить метод ConvertAll...
List integers...
internal byte[] GetBytes()
{
List bytes = new List(integers.Count * sizeof(byte));
foreach (Int32 integer in integers)
bytes.AddRange(BitConverter.GetBytes(integer));
return bytes.ToArray();
}
Поскольку вам не нужен байт [] []
, где каждое целое число отображается в массив из четырех байтов, вы не можете вызвать ConvertAll
. ( ConvertAll
не может выполнить преобразование «один ко многим»)
Вместо этого вам нужно вызвать метод LINQ SelectMany
, чтобы сгладить каждый массив байтов из GetBytes
в один байт []
:
integers.SelectMany(BitConverter.GetBytes).ToArray()
Как насчет
var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();
полностью непроверенного, кстати, но кажется разумным.
Это должно фактически дать вам массив массивов байтов ... который может быть или не быть тем, что вам нужно. Если вы хотите свернуть его в один массив, вы можете использовать SelectMany
var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
Метод ConvertAll ошибочен, поскольку он ожидает отображения 1: 1 от источника к месту назначения. Это неверно при преобразовании целых чисел в байты. Вам будет гораздо лучше пойти с решением, подобным тому, что предлагает @SLaks с методом расширения SelectMany.
Чтобы использовать метод ConvertAll, вы можете сделать следующее...
Предполагая, что у вас есть список байтов, которые на самом деле являются байтами, и вы не хотите, чтобы байты, необходимые для создания 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();