Redim Preserve in C #?

Sono rimasto scioccato nello scoprire oggi che C # non supporta matrici di dimensioni dinamiche. In che modo uno sviluppatore VB.NET abituato a utilizzare ReDim Preserve si occupa di questo in C #?

All’inizio della funzione non sono sicuro del limite superiore dell’array. Questo dipende dalle righe restituite dal database.

Usa invece ArrayLists o Generics

VB.NET non ha l’idea di matrici dimensionate dynamicmente, o – il CLR non lo supporta.

L’equivalente di “Redim Preserve” è Array.Resize – ma devi essere consapevole del fatto che se ci sono altri riferimenti all’array originale, non verranno affatto modificati. Per esempio:

 using System; class Foo { static void Main() { string[] x = new string[10]; string[] y = x; Array.Resize(ref x, 20); Console.WriteLine(x.Length); // Prints out 20 Console.WriteLine(y.Length); // Still prints out 10 } } 

Prova che questo è l’equivalente di Redim Preserve:

 Imports System Class Foo Shared Sub Main() Dim x(9) as String Dim y as String() = x Redim Preserve x(19) Console.WriteLine(x.Length) Console.WriteLine(y.Length) End Sub End Class 

I due programmi sono equivalenti.

Se vuoi veramente una raccolta di dimensioni dinamiche, dovresti usare List (o qualcosa di simile). Ci sono vari problemi con l’uso diretto degli array – vedi il post sul blog di Eric Lippert per i dettagli. Questo non vuol dire che dovresti sempre evitarli, con qualsiasi mezzo – ma devi sapere con cosa hai a che fare.

Utilizzare una lista . Ridimensiona in modo dinamico se necessario.

Davvero non dovresti usare ReDim, può essere costoso. Preferisco List (Of T), ma ci sono molte opzioni in quest’area.

Detto questo, hai avuto una domanda ed ecco la tua risposta.

 x = (int[]) Utils.CopyArray((Array) x, new int[10]); 

Non ho potuto fare a meno di notare che nessuna delle risposte di cui sopra si avvicina al concetto di array multidimensionali. Detto questo, ecco un esempio. La matrice in questione è predefinita come x .

 int[,] temp = new int[newRows, newCols]; int minRows = Math.Min(newRows, x.GetUpperBound(0) + 1); int minCols = Math.Min(newCols, x.GetUpperBound(1) + 1); for (int i = 0; i < minRows ; ++i) for (int j = 0; j < minCols; ++j) temp[i, j] = x[i, j]; x = temp; 

Solo per divertimento, ecco un modo per utilizzare i generici per ridimensionare / estendere un array unidimensionale (aggiungi un’altra “riga”):

 static T[] Redim(T[] arr, bool preserved) { int arrLength = arr.Length; T[] arrRedimed = new T[arrLength + 1]; if (preserved) { for (int i = 0; i < arrLength; i++) { arrRedimed[i] = arr[i]; } } return arrRedimed; } 

E uno per aggiungere n righe (anche se questo non impedisce all'utente di sottodimensionare l'array, che genererà un errore nel ciclo for):

 static T[] Redim(T[] arr, bool preserved, int nbRows) { T[] arrRedimed = new T[nbRows]; if (preserved) { for (int i = 0; i < arr.Length; i++) { arrRedimed[i] = arr[i]; } } return arrRedimed; } 

Sono sicuro che ti viene l'idea.

Per un array multidimensionale (due dimensioni), ecco una possibilità:

 static T[,] Redim(T[,] arr, bool preserved) { int Ubound0 = arr.GetUpperBound(0); int Ubound1 = arr.GetUpperBound(1); T[,] arrRedimed = new T[Ubound0 + 1, Ubound1]; if (preserved) { for (int j = 0; j < Ubound1; j++) { for (int i = 0; i < Ubound0; i++) { arrRedimed[i, j] = arr[i, j]; } } } return arrRedimed; } 

Nel tuo programma, usalo con o anche senza il tipo specificato, il compilatore lo riconoscerà:

 int[] myArr = new int[10]; myArr = Redim(myArr, true); 

o

 int[] myArr = new int[10]; myArr = Redim(myArr, true); 

Non sono sicuro se tutto questo sia davvero rilevante. = D Non esitate a correggermi o a migliorare il mio codice. 😉

Anche se è passato molto tempo, potrebbe aiutare qualcuno alla ricerca di una soluzione semplice: ho trovato qualcosa di eccezionale in un altro forum:

 //from Applied Microsoft.NET framework Programming - Jeffrey Richter public static Array RedimPreserve(Array origArray, Int32 desiredSize) { System.Type t = origArray.GetType().GetElementType(); Array newArray = Array.CreateInstance(t, desiredSize); Array.Copy(origArray, 0, newArray, 0, Math.Min(origArray.Length, desiredSize)); return newArray; } 

Fonte: https://social.msdn.microsoft.com/Forums/en-US/6759816b-d525-4752-a3c8-9eb5f4a5b194/redim-in-c?forum=csharplanguage