Como posso atualizar rapidamente o object para o dobro ?

Eu usando Microsoft.Office.Interop.Excel eu recebo retornou uma matriz 2D do tipo de object[,] que contém o double de elementos. Note que o limite inferior do índice é 1 vez do padrão 0 , mas eu posso lidar com isso facilmente.

Como pode converter o array em double[,] usando o .NET 3.5. (por bem quero dizer concisa ou compacta).

Observe que

 double[] values_2 = values.Cast().ToArray(); 

funciona, mas achata por matriz em uma estrutura 1D.

 object[,] src = new object[2, 3]; // Initialize src with test doubles. src[0, 0] = 1.0; src[0, 1] = 2.0; src[0, 2] = 3.0; src[1, 0] = 4.0; src[1, 1] = 5.0; src[1, 2] = 6.0; double[,] dst = new double[src.GetLength(0), src.GetLength(1)]; Array.Copy(src, dst, src.Length); 

Eu não diria que existe uma maneira que é mais rápida que outra desde que você não faça nada estúpido. Eu diria que, se você puder, lance-os quando acessá-los, e não na frente. Claro que isso depende de como você pretende acessá-los. Se você for indexar na matriz mais de uma vez, o custo de desempacotamento pode começar a aumentar demais. Se você está apenas digitalizando a matriz uma vez, casting como você vai.

Isso deve funcionar na maioria dos casos, mas pode gerar uma exceção se você não atribuir um delegado de conversão.

 public static TResult[,] Convert( this TSource[,] array, Func conversion = null) { if(array == null) throw new ArgumentNullException("array"); if (conversion == null) { var resultType = typeof(TResult); conversion = source => (TResult)System.Convert.ChangeType(source, resultType); } var width = array.GetLength(1); var height = array.GetLength(0); var result = new TResult[height, width]; for (int i = 0; i < height; ++i) for (int j = 0; j < width; ++j) result[i, j] = conversion(array[i, j]); return result; } 

Existem alguns problemas aqui.

Primeiro, desde que o double não seja um tipo de referência, ele deve ser encaixotado para ser armazenado em um object [], portanto, a única maneira de obter os valores é descompactar os valores em um duplo [] (cópia de cópia).

O outro problema é que, em C #, as matrizes são covariantes, mas não contravariantes, você pode atribuir uma matriz a uma referência de um tipo mais derivado, não a um tipo menos derivado.

 string[] strings = new string[10]; object[] objects = strings; // OK, covariant string[] strings2 = objects; // not OK, contravariant objects[0] = 10; // Compiles fine, runtime ArrayTypeMismatchException! 
 Array.Copy(src, dst, src.Length); 

Este código receberá um erro se algum valor em src for nulo. Já que no código acima src tem algum valor definido ele funciona bem. Se o valor de src for configurado dinamicamente e, infelizmente, se algum valor for nulo, o código acima não funcionará. O valor não será copiado com sucesso.