Inizializzazione di un array su un indice iniziale arbitrario in C#
-
01-07-2019 - |
Domanda
È possibile in C# inizializzare un array, ad esempio, nel sottoindice 1?
Sto lavorando con l'interoperabilità di Office e ogni proprietà è un array di oggetti che inizia con 1 (presumo che fosse originariamente programmato in VB.NET) e non puoi modificarlo, devi impostare l'intero array affinché accetti il i cambiamenti.
Per ovviare al problema, sto clonando l'array originale, modificandolo e impostandolo nel suo insieme quando ho finito.
Ma mi chiedevo se fosse possibile creare un nuovo array basato su diverso da zero
Soluzione
Puoi usare Array.CreateInstance
.
Vedere Tipi di array in .NET
Altri suggerimenti
E' possibile fare come richiesto vedi il codice qui sotto.
// Construct an array containing ints that has a length of 10 and a lower bound of 1
Array lowerBoundArray = Array.CreateInstance(typeof(int), new int[1] { 10 }, new int[1] { 1 });
// insert 1 into position 1
lowerBoundArray.SetValue(1, 1);
//insert 2 into position 2
lowerBoundArray.SetValue(2, 2);
// IndexOutOfRangeException the lower bound of the array
// is 1 and we are attempting to write into 0
lowerBoundArray.SetValue(1, 0);
Non semplicemente.Ma puoi certamente scrivere la tua lezione.Avrebbe un array come variabile privata e l'utente penserebbe che il suo array inizia da 1, ma in realtà inizia da zero e stai sottraendo 1 da tutti i suoi accessi all'array.
Puoi scrivere la tua classe di array
Non penso che sia possibile modificare l'indice iniziale degli array.
Vorrei creare il mio array utilizzando i generici e gestirlo all'interno.
Mantieni semplicemente const int denominato "offset" con un valore pari a uno e aggiungilo sempre ai pedici nel codice.
Non penso che tu possa creare array basati su valori diversi da zero in C#, ma potresti facilmente scrivere una tua classe wrapper attorno alle strutture dati integrate. Questa classe wrapper conterrebbe un'istanza privata del tipo di array richiesto;non è consentito sovraccaricare l'operatore di indicizzazione [], ma è possibile aggiungere un indicizzatore a una classe per farlo comportare come un array indicizzabile, vedere Qui.La funzione di indice che scrivi potrebbe quindi aggiungere (o sottrarre) 1 a tutti gli indici passati.
Potresti quindi utilizzare il tuo oggetto come segue e si comporterebbe correttamente:
myArrayObject[1]; //would return the zeroth element.
In VB6 potresti cambiare l'array in modo che inizi con 0 o 1, quindi penso che VBScript possa fare lo stesso.Per C#, non è possibile ma puoi semplicemente aggiungere il valore NULL nel primo [0] e iniziare il valore reale da [1].Certo, questo è un po' pericoloso...