如何快速将对象上传到double ?

我使用Microsoft.Office.Interop.Excel我返回一个类型为object[,]的2D数组object[,]其中包含元素的double 。 请注意,索引下限是1而不是默认值0 ,但我可以轻松处理。

如何使用.NET 3.5 很好地将数组转换为double[,] 。 (很好地,我的意思是简洁,或紧凑)。

注意

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

确实有效,但它通过arrays变平为一维结构。

 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); 

只要你不做任何愚蠢的事情,我就不会说有一种方式比另一种更快。 我会说,如果可以的话,在你访问它们时而不是在前面时抛出它们。 当然,这取决于您打算如何访问它们。 如果您要多次索引数组,那么拆箱的成本可能会开始变得过高。 如果你只扫描一次数组,那就随时进行投射。

这应该适用于大多数情况,但如果您不指定转换委托,则可能会抛出exception。

 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; } 

这里有几个问题。

首先,由于double不是引用类型,因此必须将其装箱以存储在object []中,因此获取值的唯一方法是将值拆分为double [](复制副本)。

另一个问题是在C#中,数组是协变的但不是逆变的,您可以将数组分配给更多派生类型的引用,而不是指向较少派生类型的引用。

 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); 

如果src中的任何值为null,则此代码将出错。 由于在上面的代码中src有一些定义的值,它工作正常。 如果src的值是动态设置的,并且不幸的是,如果任何值为null,则上述代码将不起作用。 价值不会被成功复制。