在c#中将十进制[][]转换为双精度[][]

本文关键字:转换 双精度 十进制 | 更新日期: 2023-09-27 18:09:46

我想将二维十进制数组转换为双精度数组。我希望这件事做得既有效率又整洁。这看起来又漂亮又整洁。如何将其扩展到二维数组?

我要循环通过第一个维度,并应用Linq/委托样式命令或有另一种方法来做它与更少的代码?

PS:我不太关心小数点后3-4位的精度损失。

更新:根据评论的要求,这就是我的建议,尽管我想避免:

double[][] inputs = new double[inputsArray.Length][];
for (int i = 0; i < inputsArray.Length; i++)
{
    inputs[i] = Array.ConvertAll(inputsArray[i], x => (double)x);
}

在c#中将十进制[][]转换为双精度[][]

不幸的是,对于锯齿数组,您必须分别转换每个数组,但它仍然可以在一行代码中完成:

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可以通过结合委托和数组创建来进行一些优化。

为了解决关于性能的争论,我对提出的三种解决方案进行了基准测试:

  1. Array.Convert
  2. Linq
  3. 循环
下面是代码和结果
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% faster that Array.Convert)

你可以决定7.5%的速度提升是否值得7倍的代码量。

您可以将两个Array.ConvertAll连接在一起,例如:

var dec2D = new decimal[100][];
var dbl2D = Array.ConvertAll(dec2D, x => Array.ConvertAll(x, y => (double)y));