2011-01-06 10 views
5

Esto podría ser una pregunta tonta, pero no han encontrado una respuesta simple, pero ...Inserte una matriz de bytes en otra matriz de bytes en una posición específica con C#

estoy tratando de insertar un simple # matriz de bytes c en otra matriz de bytes en una posición específica. P.ej. los bytes existentes no se deben anular, sino que se deben retroceder. Realmente igual que usted copia la página de un bloque de texto dentro de un bloque de texto existente.

  1. Hasta ahora, crearía una nueva matriz con la longitud de ambas matrices existentes.
  2. Copie la primera matriz en la nueva hasta la posición donde comienza la inserción.
  3. Agregue la matriz insertada
  4. Agregue el resto de la matriz existente.

Pero supongo que esto es algo común y debería ser más fácil? ¿O estoy equivocado?

+0

¿Estás seguro de que no quieres usar una lista? – codymanix

Respuesta

6

Utilice un List<byte> en lugar de un byte[]; le suministrará a la flexibilidad que busca ...

List<byte> b1 = new List<byte>() { 45, 46, 47, 50, 51, 52 }; 
List<byte> b2 = new List<byte> { 48, 49 }; 
b1.InsertRange(3, b2); 

Entonces, si usted necesita para volver a un byte[] por cualquier razón se puede llamar ...

b1.ToArray(); 
+0

Debería haber mencionado que estoy haciendo esto con archivos que podrían ser bastante grandes. Pero creo que obtuve las respuestas que estaba buscando. Varias maneras funcionarían, pero como en estos reality shows, tuve que elegir uno :-) – Remy

+0

@Remy: tenga en cuenta que 'Insertar' es una operación O (n). Si va a ser el uso de muchas inserciones de muy pequeñas listas de bytes, se debe considerar el uso de un [ '' ListaEnlazada ] (http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx). – Brian

+0

¡Gracias! Muy limpio y preciso – Tony

4

Mire Array.CopyTo.

Copia todos los elementos de la matriz unidimensional actual a la matriz unidimensional especificada comenzando en el índice de matriz de destino especificado.

+0

Correcto, eso ayudaría a implementar el flujo de lo que describí anteriormente. ¿Esperaba que hubiera una manera más simple? – Remy

+0

@Remy - En realidad, no, si quiere usar matrices. – Oded

+1

-1 CopyTo va a sobrescribir los contenidos basándose en el índice inicial; que el OP dijo que no querían hacer. –

8

Pero yo supongo que es algo común

Si la inserción de una gran parte de los datos en el medio de otra gran parte de los datos es algo que a menudo entonces es posible considerar el uso de un conjunto de datos estructura diseñada para hacer eso. Una matriz está diseñada para ser fija en tamaño y mutable en contenido. Si su requisito incluye "variable en tamaño", una matriz es el tipo de datos incorrecto para usted. Considere en su lugar una lista doblemente vinculada o un deque registrable.

y debería ser más fácil?

Has identificado un algoritmo trivial de cuatro pasos que hace lo que quieres. No es mucho más fácil que eso.

1

Si el rendimiento no es importante , considero:

var combined = first.Take(insertPosition) 
        .Concat(second) 
        .Concat(first.Skip(insertPosition)) 
        .ToArray(); 

supongo que esto es más o menos la de cuatro pasos que algo ha sugerido, excepto el primer paso "viene al final." Sin embargo, tenga en cuenta que esto es ineficiente por una serie de razones, incluyendo un buffer innecesariamente dinámico y una enumeración parcial redundante de la primera matriz.

De lo contrario, lo que ha sugerido está perfectamente bien.

0

Si puede cambiar su objeto por algo un poco más grande, puede ver cosas como una lista que tiene un método InsertRange que hace lo que quiere (http://msdn.microsoft.com/en-us/library /884ee1fz.aspx). Por supuesto, el uso de un objeto diferente puede no ser una opción, pero es una sugerencia para una manera fácil de hacer las cosas. También otros objetos pueden ser más útiles. Compre ... :)

0

Un matriz, por definición, tiene un tamaño fijo. No puede insertar o eliminar elementos, solo sobrescribir elementos.

Usted debe una listalugar. Las listas proporcionan métodos para insertar o eliminar elementos y subrangos.

+1

Por supuesto, como detalle de implementación, una lista es solo una vista de una matriz; todas las inserciones y eliminaciones solo hacen las operaciones de copia de matriz por usted. –

+0

Sí, de hecho. Al final, la Lista de clases está haciendo el mismo algoritmo internamente que OP no quería escribir por sí mismo. – codymanix

Cuestiones relacionadas