cambia la dimensione dell’array

È ansible modificare le dimensioni di un array dopo la dichiarazione? In caso contrario, c’è qualche alternativa agli array?
Non voglio creare una matrice con una dimensione di 1000, ma non conosco la dimensione della matrice quando la sto creando.

No, prova invece a utilizzare una lista fortemente tipizzata.

Per esempio:

Invece di usare

int[] myArray = new int[2]; myArray[0] = 1; myArray[1] = 2; 

Potresti fare questo:

 List myList = new List(); myList.Add(1); myList.Add(2); 

Gli elenchi utilizzano gli array per archiviare i dati in modo da ottenere il vantaggio in termini di velocità degli array con la comodità di un LinkedList grazie alla possibilità di aggiungere e rimuovere elementi senza doversi preoccupare di dover modificare manualmente le dimensioni.

Ciò non significa che le dimensioni di un array (in questo caso, un List ) non vengano modificate, quindi l’enfasi sulla parola manualmente.

Non appena l’array raggiunge la sua dimensione predefinita, il JIT assegnerà un nuovo array sull’heap che è il doppio della dimensione e copierà l’array esistente.

È ansible utilizzare Array.Resize() , documentato in MSDN .

Ma sì, sono d’accordo con Corey, se hai bisogno di una struttura dati di dimensioni dinamiche, abbiamo List per questo.

Importante: Array.Resize() non ridimensiona l’array (il nome del metodo è fuorviante), crea un nuovo array e sostituisce solo il riferimento passato al metodo.

Un esempio:

 var array1 = new byte[10]; var array2 = array1; Array.Resize(ref array1, 20); // Now: // array1.Length is 20 // array2.Length is 10 // Two different arrays. 

È ansible utilizzare Array.Resize() in .net 3.5 e versioni successive. Questo metodo alloca un nuovo array con le dimensioni specificate, copia gli elementi dal vecchio array a quello nuovo e quindi sostituisce il vecchio array con quello nuovo. (Quindi avrai bisogno della memoria disponibile per entrambi gli array poiché probabilmente usa Array.Copy sotto le copertine)

Utilizzato questo approccio per la matrice di byte:

inizialmente:

 byte[] bytes = new byte[0]; 

Quando richiesto (è necessario fornire la lunghezza originale per l’estensione):

 Array.Resize(ref bytes, bytes.Length + requiredSize); 

Reset:

 Array.Resize(ref bytes, 0); 

Metodo dell’elenco digitato

inizialmente:

 List bytes = new List(); 

Quando richiesto:

 bytes.AddRange(new byte[length]); 

Rilasciare / Clear:

 bytes.Clear() 

Usa System.Collections.Generic.List

Utilizzare invece una List . Ad esempio, invece di una serie di interi

 private int[] _myIntegers = new int[1000]; 

uso

 private List _myIntegers = new List(); 

dopo

 _myIntegers.Add(1); 

In C #, gli array non possono essere ridimensionati dynamicmente.

  • Un approccio consiste nell’utilizzare System.Collections.ArrayList invece di un native array .

  • Un’altra soluzione (più veloce) consiste nel riassegnare l’array con una dimensione diversa e copiare il contenuto del vecchio array sul nuovo array.

    La funzione generica resizeArray (sotto) può essere utilizzata per farlo.

     public static System.Array ResizeArray (System.Array oldArray, int newSize) { int oldSize = oldArray.Length; System.Type elementType = oldArray.GetType().GetElementType(); System.Array newArray = System.Array.CreateInstance(elementType,newSize); int preserveLength = System.Math.Min(oldSize,newSize); if (preserveLength > 0) System.Array.Copy (oldArray,newArray,preserveLength); return newArray; } public static void Main () { int[] a = {1,2,3}; a = (int[])ResizeArray(a,5); a[3] = 4; a[4] = 5; for (int i=0; i 

In C #, Array.Resize è il metodo più semplice per ridimensionare qualsiasi array a nuova dimensione, ad esempio:

 Array.Resize(ref area, size); 

Qui, voglio ridimensionare la dimensione dell’array dell’array LinkButton:

= specifica il tipo di array
ref area = ref è una parola chiave e ‘area’ è il nome dell’array
size = array di nuove dimensioni

  private void HandleResizeArray() { int[] aa = new int[2]; aa[0] = 0; aa[1] = 1; aa = MyResizeArray(aa); aa = MyResizeArray(aa); } private int[] MyResizeArray(int[] aa) { Array.Resize(ref aa, aa.GetUpperBound(0) + 2); aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0); return aa; } 

Sì, è ansible ridimensionare un array. Per esempio:

 int[] arr = new int[5]; // increase size to 10 Array.Resize(ref arr, 10); // decrease size to 3 Array.Resize(ref arr, 3); 

Se si crea una matrice con il metodo CreateInstance (), il metodo Resize () non funziona. Per esempio:

 // create an integer array with size of 5 var arr = Array.CreateInstance(typeof(int), 5); // this not work Array.Resize(ref arr, 10); 

La dimensione dell’array non è dynamic, anche noi possiamo ridimensionarla. Se vuoi un array dinamico, penso che possiamo invece usare l’Elenco generico.

 var list = new List(); // add any item to the list list.Add(5); list.Add(8); list.Add(12); // we can remove it easily as well list.Remove(5); foreach(var item in list) { Console.WriteLine(item); } 

Utilizzare un elenco (dove T è di qualsiasi tipo o object) quando si desidera aggiungere / rimuovere dati, poiché il ridimensionamento degli array è costoso. Puoi leggere ulteriori informazioni sugli array considerati in qualche modo dannosi, mentre un elenco può essere aggiunto a nuovi record che possono essere aggiunti alla fine. Regola le sue dimensioni come necessario.

Un elenco può essere initalizzato nei seguenti modi

Utilizzando l’inizializzatore di raccolta.

 List list1 = new List() { "carrot", "fox", "explorer" }; 

Utilizzo della parola chiave var con l’inizializzatore della raccolta.

 var list2 = new List() { "carrot", "fox", "explorer" }; 

Usando il nuovo array come parametro.

 string[] array = { "carrot", "fox", "explorer" }; List list3 = new List(array); 

Utilizzando la capacità nel costruttore e assegnare.

 List list4 = new List(3); list4.Add(null); // Add empty references. (Not Recommended) list4.Add(null); list4.Add(null); list4[0] = "carrot"; // Assign those references. list4[1] = "fox"; list4[2] = "explorer"; 

Utilizzando il metodo Aggiungi per ciascun elemento.

 List list5 = new List(); list5.Add("carrot"); list5.Add("fox"); list5.Add("explorer"); 

Pertanto, per un elenco oggetti è ansible allocare e assegnare le proprietà degli oggetti in linea con l’inizializzazione dell’elenco. Gli inizializzatori di oggetti e gli inizializzatori di raccolta condividono una syntax simile.

 class Test { public int A { get; set; } public string B { get; set; } } 

Elenco di inizializzazione con inizializzatore di raccolta.

 List list1 = new List() { new Test(){ A = 1, B = "Jessica"}, new Test(){ A = 2, B = "Mandy"} }; 

Inizializza la lista con nuovi oggetti.

 List list2 = new List(); list2.Add(new Test() { A = 3, B = "Sarah" }); list2.Add(new Test() { A = 4, B = "Melanie" }); 

Questo ha funzionato bene per me per creare un array dinamico da un array di classi.

 var s = 0; var songWriters = new SongWriterDetails[1]; foreach (var contributor in Contributors) { Array.Resize(ref songWriters, s++); songWriters[s] = new SongWriterDetails(); songWriters[s].DisplayName = contributor.Name; songWriters[s].PartyId = contributor.Id; s++; } 

Utilizzare un elenco generico (System.Collections.Generic.List).