Quindi it turns out tutti gli array non sono creati uguali. Gli array multidimensionali possono avere limiti inferiori diversi da zero. Vedere ad esempio la proprietà Range.Value di Excel PIA object[,] rectData = myRange.Value;
Il modo più veloce per convertire T [,] in T [] []?
Ho bisogno di convertire questi dati in una matrice seghettata. La mia prima prova di sotto odora di complessità. Qualche suggerimento per ottimizzarlo? Ha bisogno di gestire il caso generale in cui i limiti inferiori potrebbero non essere zero.
ho questo ex metodo:
public static T[][] AsJagged<T>(this T[,] rect)
{
int row1 = rect.GetLowerBound(0);
int rowN = rect.GetUpperBound(0);
int col1 = rect.GetLowerBound(1);
int colN = rect.GetUpperBound(1);
int height = rowN - row1 + 1;
int width = colN - col1 + 1;
T[][] jagged = new T[height][];
int k = 0;
int l;
for (int i = row1; i < row1 + height; i++)
{
l = 0;
T[] temp = new T[width];
for (int j = col1; j < col1 + width; j++)
temp[l++] = rect[i, j];
jagged[k++] = temp;
}
return jagged;
}
usati in questo modo:
public void Foo()
{
int[,] iRect1 = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
int[][] iJagged1 = iRect1.AsJagged();
int[] lengths = { 3, 5 };
int[] lowerBounds = { 7, 8 };
int[,] iRect2 = (int[,])Array.CreateInstance(typeof(int), lengths, lowerBounds);
int[][] iJagged2 = iRect2.AsJagged();
}
Curioso se Buffer.BlockCopy() avrebbe funzionato o più veloce?
Modifica: AsJagged deve gestire i tipi di riferimento.
Modifica: trovato bug in AsJagged(). Aggiunto int l
; e ha aggiunto col1 + width
al ciclo interno.
+1 per la cosa matematica. Questa è un'operazione non tribale a prescindere da come la si trasforma perché è sufficiente copiare tutti i dati per definizione. Il meglio che si può ottenere è che ciò avvenga con metodi di blocco, non manualmente copia articolo per articolo, ma è un'operazione lenta. Niente al mondo lo cambierà. – TomTom
+1 anche per analisi O-nazionali. Si noti tuttavia che il compilatore C# in realtà si ottimizza molto meno di quanto si pensi comunemente. La maggior parte delle ottimizzazioni viene effettivamente eseguita quando si esegue l'IL su un codice macchina. Quindi, a meno che tu non sia bravo nel tuo assemblatore (x86, x64, qualunque cosa), non è troppo facile provare realmente cosa è fatto e cosa no. –
Ragazzi, date un'occhiata al mio ultimo suggerimento, evita di copiare del tutto i dati. – zmbq