不幸的是,使用锯齿数组您将需要分别转换每个数组,但仍然可以在一行代码中完成:
doubleArray = Array.ConvertAll(decimalArray, da => Array.ConvertAll(da, d => (double)d))
或者使用Linq:
doubleArray = decimalArray.Select(da => da.Select(d => (double)d).ToArray()).ToArray();
要确定哪个更快,您需要试一下;Array.ConvertAll
可能通过组合委托和数组创建来进行一些优化。
基准测试
为了解决性能问题的争议,我对三种提出的解决方案进行了基准测试:
Array.Convert
- Linq
- 循环
以下是代码和结果
int I = 10000;
int J = 1000;
Random rand = new Random();
decimal[][] decimalArray = new decimal[I][];
decimalArray = Enumerable.Range(1,I).Select(i =>
Enumerable.Range(1, J).Select (j => (decimal)rand.NextDouble()).ToArray()
).ToArray();
Stopwatch s = new Stopwatch();
// Array.ConvertAll
s.Start();
var doubleArray = Array.ConvertAll(decimalArray, da => Array.ConvertAll(da, d => (double)d));
s.Stop();
s.Dump();
// Linq
s.Restart();
doubleArray = decimalArray.Select(da => da.Select(d => (double)d).ToArray()).ToArray();
s.Stop();
s.Dump();
// Loops
s.Restart();
doubleArray = new double[I][];
for(int i = 0; i < I; i++)
{
decimal[] dda = decimalArray[i];
doubleArray[i] = new double[dda.Length];
double[] da = doubleArray[i];
for(int j = 0; j < dda.Length; j++)
{
da[j] = (double)dda[j];
}
}
s.Stop();
s.Dump();
Method ElapsedMilliseconds
------------- ----------------------
Array.Convert 310
Linq 478
Loops 287 (7.5
你可以决定,一个7.5%的速度提升是否值得增加7倍的代码量。