2016-01-24 9 views
5

Sto cercando di capire se c'è un modo per fare qualcosa in C# che è abbastanza facile da fare in C++. Specificamente, se ho una matrice di dati, posso creare un puntatore in quei dati per accedere più comodamente a una sottosezione.Modo per accedere al sottoinsieme dell'array?

Per esempio, se ho:

unsigned char buffer[1000]; 

e determino che c'è una stringa in posizioni 102 a 110 all'interno di quella matrice che ho bisogno di manipolare molto, posso fare questo:

unsigned char *strPtr = &buffer[102]; 
char firstChar = strPtr[0]; 

Ciò mi evita di dover aggiungere "102" a ciascun indice di array nelle operazioni successive.

Mentre riconosco la possibilità di situazioni non sicure quando si fa qualcosa di simile, mi chiedo se ci sia un equivalente morale in C# che mi permetta di creare un nuovo riferimento a un sottoinsieme di un array esistente.

Qualcosa di simile:

byte [8] newArray = &buffer[102]; 

Questo esempio in realtà non funziona o non sarebbe stato questo distacco, ma penso che si ottiene l'idea di ciò che voglio realizzare attraverso.

+0

Vorresti che fosse una copia o modificare direttamente la matrice originale? – BalinKingOfMoria

+0

In realtà non ci scriverò, semplicemente leggendo da esso. Vorrei evitare di copiare i dati. In realtà, non mi chiederei se copiare i dati non fosse un punto di partenza. –

+0

Se la vostra preoccupazione è solo quella di leggere i dati, perché non mantenere semplicemente un 'int offset = 102; buffer [offset + i] ... '? Significa che non hai bisogno di codice non sicuro per svolgere l'attività. 'ArraySegment ' è sicuramente un approccio ancora più pulito per fare lo stesso. Se si sta veramente cercando di evitare il calcolo dell'offset per qualche ragione, allora si deve usare un codice non sicuro. –

risposta

4

C'è la classe ArraySegment<T> che può essere utilizzata come wrapper per accedere ai segmenti di un array. Basta fornire l'array, un offset e la lunghezza del segmento e potresti usarlo come se fosse l'array vero e proprio. Otterrai il controllo dei limiti e altre sottigliezze sull'utilizzo degli array.

var buffer = new byte[1000]; 
var newArray = new ArraySegment<byte>(buffer, 102, 8) as IList<byte> // we have an "array" of byte[8] 
var firstChar = newArray[0]; 

C'è una proposal però di introdurre serie affettare. Come in ArraySegment, le sezioni consentono di creare viste in matrici (senza fare copie) e possono essere utilizzate al posto di matrici reali. Spero che diventerà una (prossima) futura versione di C#.

+0

Non è l'ArraySegment che fa ciò che l'OP sta tentando di evitare ottenendo/modificando l'elemento previsto dell'errore originale con l'uso dell'offset? Ho pensato che la struttura funzionasse aggiungendo il tuo indice + "_offset" interno e restituendo l'elemento risultante. –

+0

@JasonW Ma la tecnica descritta nell'OP è esattamente quella, una scorciatoia per aggiungere un "offset" all'array. – Kroltan

+0

Sembra che stia cercando di evitare di aggiungere l'offset ogni volta che accede all'elemento. So che _offset è memorizzato nella struct, ma quello di cui non ero sicuro era che se _offset veniva usato ogni volta che si accede all'elemento (è quello che penso stia tentando di impedire per qualsiasi motivo) –

Problemi correlati