2011-12-17 37 views
5

Tengo una lista que me estoy convirtiendo en un byte [], así:C# byte [] volver a la lista <int>

List<int> integerList = new List<int>(); 

integerList.Add(1); 
integerList.Add(2); 
integerList.Add(3); 

byte[] bytes = integerList.SelectMany(BitConverter.GetBytes).ToArray(); 

¿Cómo convierto esto de nuevo a una lista?

Respuesta

15

Una de las muchas maneras de hacerlo (un LINQ uno):

var originalList = Enumerable.Range(0, bytes.Length/4) 
          .Select(i => BitConverter.ToInt32(bytes, i * 4)) 
          .ToList(); 

actualización menor:

También puede escribir una versión práctica y genérica de esto (en caso de que tenga que preocuparse k con otros tipos):

static List<T> ToListOf<T>(byte[] array, Func<byte[], int, T> bitConverter) 
{ 
    var size = Marshal.SizeOf(typeof(T)); 
    return Enumerable.Range(0, array.Length/size) 
        .Select(i => bitConverter(array, i * size)) 
        .ToList(); 
} 

Uso:

var originalList = ToListOf<int>(bytes, BitConverter.ToInt32); 
+0

Gran respuesta. El problema es que el tamaño interno que Nate está tratando de analizar no es consistentemente de 4 bytes. –

+1

Respuesta actualizada: versión genérica agregada que funcionará con cualquier tipo – max

+0

Bravo. Te volvería a votar si pudiera. –

1
byte[] is an IEnumerable; LINQ's ToList() extension method should do it. 

EDIT: Si desea una lista de int de:

bytes.Select((b) => (int)b).toList(); 
+0

que produciría una lista de bytes, correcto? –

+0

Sí; ¿No es eso lo que estás preguntando? – Melllvar

+0

Sí, eso solo produce una lista de bytes, acaba de probarlo. – Nate

Cuestiones relacionadas