簡體   English   中英

在C#中將decimal [] []轉換為double [] []

[英]Convert decimal[][] to double[][] in C#

我想將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);
}

不幸的是,對於鋸齒狀陣列,你必須單獨轉換每個數組,但它仍然可以在一個單行中完成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM