Tak więc wszystkie tablice nie są sobie równe. Wielowymiarowe tablice mogą mieć niezerowe niższe granice. Patrz na przykład Excel PIA's Range.Value Właściwość object[,] rectData = myRange.Value;
Najszybszy sposób konwertowania T [,] na T [] []?
Muszę przekonwertować te dane na poszarpaną tablicę. Moja pierwsza próba poniżej pachnie złożonością. Wszelkie sugestie optymalizacji? Musi obsłużyć ogólny przypadek, w którym dolna granica nie może wynosić zero.
mam tej metody Ex:
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;
}
używany tak:
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();
}
Ciekawy jeśli Buffer.BlockCopy() będzie działać lub być szybciej?
Edycja: AsJagged musi obsługiwać typy odniesienia.
Edytuj: Znaleziono błąd w AsJagged(). Dodano int l
; i dodał col1 + width
do wewnętrznej pętli.
+1 za rzecz matematyczną. Jest to operacja inna niż trójwymiarowa, niezależnie od tego, jak ją zmienisz, ponieważ musisz po prostu skopiować wszystkie dane z definicji. Najlepsze, co możesz zrobić, to zrobić za pomocą metod blokowych, a nie ręcznego kopiowania przedmiotów po egzemplarzu, ale to jest powolna operacja. Nic na świecie tego nie zmieni. – TomTom
+1 również w przypadku analizy krajowej. Należy jednak pamiętać, że kompilator C# faktycznie optymalizuje się znacznie mniej niż się powszechnie zakłada. Większość optymalizacji jest rzeczywiście wykonywana podczas łączenia IL z kodem maszyny. Więc jeśli nie jesteś dobry w asemblerach (x86, x64, cokolwiek), nie jest zbyt łatwo potwierdzić, co zostało zrobione, a co nie. –
Faceci, zobacz moją ostatnią sugestię, unikają kopiowania danych w ogóle. – zmbq