2011-01-06 1 views
5

Questa potrebbe essere una domanda stupida, ma non ho trovato una risposta semplice ma ...Inserire un array di byte in un altro array di byte in una posizione specifica con C#

che sto cercando di inserire una semplice c array di byte # in un altro array di byte in una posizione specifica. Per esempio. i byte esistenti non devono essere ignorati, ma spostati più indietro. Davvero proprio come si copia una pagina di un blocco di testo all'interno di un blocco di testo esistente.

  1. Finora, vorrei creare un nuovo array con la lunghezza di entrambi gli array esistenti.
  2. Copia il primo array nel nuovo fino alla posizione in cui inizia l'inserimento.
  3. Aggiungere l'array inserito
  4. Aggiungere il resto dell'array esistente.

Ma suppongo che questo sia qualcosa di comune e dovrebbe essere più semplice? O mi sbaglio?

+0

Sei sicuro di non voler utilizzare una lista? – codymanix

risposta

6

Utilizzare uno List<byte> anziché uno byte[]; esso fornirà la flessibilità siete alla ricerca di ...

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

Poi, se avete bisogno di andare di nuovo ad un byte[] per qualsiasi ragione si può chiamare ...

b1.ToArray(); 
+0

Avrei dovuto dire che sto facendo questo con file che potrebbero diventare abbastanza grandi. Ma credo di aver ottenuto le risposte che stavo cercando. Molteplici modi funzionerebbero, ma come in questi reality show, dovevo sceglierne uno :-) – Remy

+0

@Remy: nota che 'Insert' è un'operazione O (n). Se si prevede di utilizzare molti Inserti di elenchi molto piccoli di byte, si dovrebbe considerare l'utilizzo di un ['LinkedList '] (http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx). – Brian

+0

Grazie! Molto pulito e preciso. – Tony

4

Vedere Array.CopyTo.

Copia tutti gli elementi della matrice unidimensionale corrente sulla matrice unidimensionale specificata iniziando dall'indice di matrice di destinazione specificato.

+0

Giusto, ciò aiuterebbe a implementare il flusso quanto descritto sopra. Speravo che ci fosse un modo più semplice? – Remy

+0

@Remy - Non proprio, non se si desidera utilizzare gli array. – Oded

+1

-1 CopyTo sovrascriverà il contenuto in base all'indice di partenza; che il PO ha dichiarato di non voler fare. –

8

Ma vorrei assumere questo è qualcosa di comune

Se l'inserimento di un grande pezzo di dati nel bel mezzo di un altro grande pezzo di dati è qualcosa che spesso allora si potrebbe considerare l'utilizzo di un data struttura progettata per farlo. Un array è progettato per essere fissato nella dimensione e modificabile nel contenuto. Se la tua richiesta include "variable in size", allora un array è il tipo di dati sbagliato per te. Considera invece una lista doppiamente collegata o una deque catenabile.

e dovrebbe essere più semplice?

Hai identificato un algoritmo di quattro passaggi banale che fa ciò che vuoi. Non è molto più facile di così.

1

Se le prestazioni non è importante , considero:

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

suppongo che questo è praticamente la quattro fasi algo hai suggerito, ad eccezione del primo passo "arriva alla fine." Tuttavia, si noti che questo è inefficiente per una serie di motivi, tra cui un buffer dinamico inutilmente e una enumerazione parziale ridondante del primo array.

In caso contrario, ciò che hai suggerito è perfettamente a posto.

0

Se potessi scambiare il tuo oggetto con qualcosa di un po 'più grande, potresti guardare cose come una lista che ha un metodo InsertRange che fa quello che vuoi (http://msdn.microsoft.com/en-us/library /884ee1fz.aspx). Naturalmente l'utilizzo di un oggetto diverso potrebbe non essere un'opzione ma è un suggerimento per un modo semplice di fare le cose. Anche altri oggetti potrebbero essere più utili. Guardarsi intorno ... :)

0

Un matrice, per definizione, ha una dimensione fissa. Non è possibile inserire o rimuovere elementi, basta sovrascrivere gli elementi.

È necessario un elenco . Gli elenchi forniscono i metodi per inserire o rimuovere elementi e subranges.

+1

Ovviamente, come dettaglio di implementazione, un elenco è solo una vista di un array; tutti gli inserimenti e le rimozioni eseguono semplicemente le operazioni di copia dell'array per te. –

+0

Sì, davvero. Alla fine, la classe List sta facendo internamente lo stesso algoritmo che l'OP non voleva scrivere da solo. – codymanix