Zgadzam się, że praca z bazą-1 macierzy z .NET może być uciążliwe. Jest również potencjalnie podatny na błędy, ponieważ musisz mentalnie dokonywać zmian za każdym razem, gdy go używasz, a także prawidłowo pamiętać, które sytuacje będą podstawą 1, i która będzie podstawowa 0.
Najbardziej wydajnym podejściem jest po prostu wykonaj te mentalne przesunięcia i indeksuj odpowiednio, używając base-1 lub base-0, jeśli jest to wymagane.
Ja osobiście wolę konwertować dwuwymiarowe tablice base-1 na dwuwymiarowe tablice base-0. To niestety wymaga uderzenia wydajności kopiowania tablicy do nowej tablicy, ponieważ nie ma sposobu na ponowne zbudowanie tablicy w miejscu.
Oto metoda rozszerzenie, które może zrobić to za 2D tablic zwróconych przez Excel:
public static TResult[,] CloneBase0<TSource, TResult>(
this TSource[,] sourceArray)
{
If (sourceArray == null)
{
throw new ArgumentNullException(
"The 'sourceArray' is null, which is invalid.");
}
int numRows = sourceArray.GetLength(0);
int numColumns = sourceArray.GetLength(1);
TResult[,] resultArray = new TResult[numRows, numColumns];
int lb1 = sourceArray.GetLowerBound(0);
int lb2 = sourceArray.GetLowerBound(1);
for (int r = 0; r < numRows; r++)
{
for (int c = 0; c < numColumns; c++)
{
resultArray[r, c] = sourceArray[lb1 + r, lb2 + c];
}
}
return resultArray;
}
I wtedy można go używać tak:
object[,] array2DBase1 = (object[,]) MySheet.UsedRange.get_Value(Type.Missing);
object[,] array2DBase0 = array2DBase1.CloneBase0();
for (int row = 0; row < array2DBase0.GetLength(0); row++)
{
for (int column = 0; column < array2DBase0.GetLength(1); column++)
{
// Your code goes here...
}
}
Dla masowo wielkości tablic, to polubisz Nie chcę tego robić, ale ogólnie uważam, że to naprawdę oczyszcza twój kod (i nastawiony na umysł), aby dokonać tej konwersji, a następnie zawsze działa w base-0.
Nadzieja to pomaga ...
Mike
Tablice w C# są zawsze oparte na 0, czy masz na myśli twoje dane oparte na 1? – cjk
Tablice * zadeklarowane * w kodzie źródłowym C# są zawsze oparte na 0, ale CLR obsługuje tablice z dowolnie niższymi granicami. –
Tablice _created_w C# mogą być oparte na zerach, jednak uważam, że mam rację stwierdzając, że tablica jest tutaj 1 - jeśli spróbujesz uzyskać dostęp do ExcelData [0,0], zostanie zgłoszony wyjątek IncexOutOfRangeException. – GalleySlave