Estoy de acuerdo que el trabajo con la base-1 matrices de .NET puede ser una molestia. También es potencialmente propenso a errores, ya que tiene que hacer un cambio mental cada vez que lo usa, así como recordar correctamente qué situaciones serán la base 1 y cuál será la base 0.
El enfoque más eficiente es simplemente haga estos cambios mentales e indexe adecuadamente, usando base-1 o base-0 según sea necesario.
Personalmente, prefiero convertir las matrices bidimensionales base-1 en matrices bidimensionales base-0. Desafortunadamente, esto requiere el rendimiento de copiar sobre la matriz a una nueva matriz, ya que no hay forma de volver a basar una matriz en su lugar.
He aquí un método de extensión que pueden hacer esto para las matrices 2D devueltos por 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;
}
y luego se puede utilizar de esta manera:
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...
}
}
Para las matrices de forma masiva de tamaño, es posible que No quiero hacer esto, pero creo que, en general, realmente limpia tu código (y tu mentalidad) para hacer esta conversión, y luego siempre funciona en base-0.
Espero que esto ayude ...
Mike
Las matrices en C# siempre están basadas en 0, ¿quiere decir que sus datos están basados en 1? – cjk
Las matrices * declaradas * en el código fuente de C# siempre están basadas en 0, pero la CLR admite matrices con límites inferiores arbitrarios. –
Las matrices _created_ in C# bien pueden estar basadas en cero, sin embargo, creo que estoy en lo cierto al afirmar que la matriz aquí está basada en 1; si intenta acceder a ExcelData [0,0], se lanza IncexOutOfRangeException. – GalleySlave