Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中将十进制[]转换为双精度[]#_C#_Arrays_Casting_Double_Decimal - Fatal编程技术网

C# 在C语言中将十进制[]转换为双精度[]#

C# 在C语言中将十进制[]转换为双精度[]#,c#,arrays,casting,double,decimal,C#,Arrays,Casting,Double,Decimal,我想将二维十进制数组转换为双数组。我希望这是做得相当有效,但也整洁。看起来很整洁。如何将其扩展到二维阵列 我是否必须循环第一个维度并应用Linq/委托样式命令,或者是否有其他方法可以用更少的代码来完成 PS:我不太担心精度超过小数点后3-4位 更新:应评论的要求,这是我的建议,尽管我希望避免: double[][] inputs = new double[inputsArray.Length][]; for (int i = 0; i < inputsArray.Length; i++)

我想将二维十进制数组转换为双数组。我希望这是做得相当有效,但也整洁。看起来很整洁。如何将其扩展到二维阵列

我是否必须循环第一个维度并应用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);
}
double[]inputs=新的双精度[inputsArray.Length][];
for(int i=0;i(double)x);
}

您可以连接两个
数组。ConvertAll
例如:

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

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

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
  • 林克
  • 循环
  • 下面是代码和结果

    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)
    
    inti=10000;
    int J=1000;
    Random rand=新的Random();
    十进制[][]十进制数组=新的十进制[I][];
    十进制数组=可枚举的。范围(1,I)。选择(I=>
    Enumerable.Range(1,J).选择(J=>(十进制)rand.NextDouble()).ToArray()
    ).ToArray();
    秒表s=新秒表();
    //Array.ConvertAll
    s、 Start();
    var doubleArray=Array.ConvertAll(十进制数组,da=>Array.ConvertAll(da,d=>(double)d));
    s、 停止();
    s、 Dump();
    //林克
    s、 重启();
    doubleArray=decimalArray.Select(da=>da.Select(d=>(double)d.ToArray()).ToArray();
    s、 停止();
    s、 Dump();
    //循环
    s、 重启();
    doubleArray=新的双[I][];
    for(int i=0;i

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

    共享您尝试过的代码如果您想要效率,请不要为每个元素调用一个委托。@usr-您会提出什么替代方案?@usr:据我所知,他实际上知道如何使用循环,他希望有一个简洁而快速的解决方案。我想ConvertAll可能足以满足这些要求……大概ConvertAll在其实现中使用循环吧?@ArmenSafieh Garabedian确实如此-您可以