在C#中将decimal [] []转换为double [] []

 愁撒_651 发布于 2023-01-08 13:12

我想将2D十进制数组转换为双数组.我希望这项工作相当有效,但也要整洁.这看起来很整洁.如何将其扩展为2D阵列?

我是否必须遍历第一个维度并应用Linq/delegate样式命令,还是有另一种方法可以用更少的代码来完成它?

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

D Stanley.. 5

不幸的是,对于锯齿状阵列,你必须单独转换每个数组,但它仍然可以在一个单行中完成:

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% faster that Array.Convert)

您可以决定7.5%的速度提升是否相当于代码量的7倍.

1 个回答
  • 不幸的是,对于锯齿状阵列,你必须单独转换每个数组,但它仍然可以在一个单行中完成:

    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% faster that Array.Convert)
    

    您可以决定7.5%的速度提升是否相当于代码量的7倍.

    2023-01-08 13:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有