12

我尝试使用List.ConvertAll方法但失败了。我想要做的是将 a 转换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

4 回答 4

17

由于您不希望byte[][]每个整数映射到四个字节的数组,因此您不能调用ConvertAll. (ConvertAll不能进行一对多转换)

相反,您需要调用 LINQSelectMany方法将每个字节数组从扁平GetBytes化为一个byte[]

integers.SelectMany(BitConverter.GetBytes).ToArray()
于 2010-06-22T23:17:51.603 回答
3

怎么样

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

顺便说一句,完全未经测试,但似乎是合理的。

这实际上应该给你一个字节数组的数组......这可能是也可能不是你需要的。如果你想把它折叠成一个数组,你可以使用SelectMany

var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
于 2010-06-22T23:15:27.437 回答
2

ConvertAll 方法存在缺陷,因为它期望从源到目标存在 1:1 映射。将整数转换为字节时,情况并非如此。最好使用 @SLaks 建议的 SelectMany 扩展方法之类的解决方案。

于 2010-06-22T23:23:35.823 回答
1

要使用 ConvertAll 方法,您可以执行以下操作...

假设您有一个真正是字节值的整数列表,并且您实际上并不想要组成整数所需的字节,即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();
于 2010-06-22T23:29:50.863 回答