12

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

4 に答える 4

17

各整数が 4 バイトの配列にマップされるは必要ないためbyte[][]、 を呼び出すことはできませんConvertAll。( ConvertAll1 対多の変換は実行できません)

SelectMany代わりに、LINQメソッドを呼び出して、各バイト配列を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 メソッドを使用するには、次の操作を実行できます...

実際にはバイト値である 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();
于 2010-06-22T23:29:50.863 に答える