2016-05-21 47 views
0

我使用以下代碼嘗試使用來自兩個單獨數組的值進行一些計算。作爲最後一步,我一直試圖將值列表聚合,但每次運行程序時,它只有一組值在列表中。 abcXLoopVars是一個自定義類,用於存儲稍後彙總的不同變量。C#並行返回值

Parallel.For<abcXLoopVars>(0, colX.Count(), 
      () => { return new abcXLoopVars(); }, 
      (i, pls, state) => 
     { 
      state = new abcXLoopVars(); 
      double x = Math.Abs(colX[i]); 
      double y = Math.Abs(colY[i]); 
      double lnx = Math.Log(x); 
      double lny = Math.Log(y); 
      double xminxbarsq = Math.Pow(colX[i] - xbar, 2); 
      double xminxbarcub = Math.Pow(colX[i] - xbar, 4); 
      state.sumxminxbarsq = xminxbarsq; 
      state.sumxminxbarcub = xminxbarcub; 
      state.sumlnxxminxbarsq = lnx * xminxbarsq; 
      state.sumlnxlny = lnx * lny; 
      state.sumlnxsq = Math.Pow(lnx, 2); 
      state.sumlnx = sumlnx + lnx; 
      state.sumlnyxminxbarsq = lny * xminxbarsq; 
      state.sumlny = lny; 
      state.posneg = colY[i]/colX[i]; 

      return state; 
     }, 
     (state) => { lock (lockMe) abxList.Add(state);} 
     ); 

回答

0

我建議你把它改寫爲PLINQ:

colX.Zip(colY, (x, y) => 
     { 
      var state = new abcXLoopVars(); 
      double lnx = Math.Log(x); 
      double lny = Math.Log(y); 
      double xminxbarsq = Math.Pow(x - xbar, 2); 
      double xminxbarcub = Math.Pow(x - xbar, 4); 
      state.sumxminxbarsq = xminxbarsq; 
      state.sumxminxbarcub = xminxbarcub; 
      state.sumlnxxminxbarsq = lnx * xminxbarsq; 
      state.sumlnxlny = lnx * lny; 
      state.sumlnxsq = Math.Pow(lnx, 2); 
      state.sumlnx = sumlnx + lnx; 
      state.sumlnyxminxbarsq = lny * xminxbarsq; 
      state.sumlny = lny; 
      state.posneg = y/x; 

      return state; 
     }).AsParallel().ToList(); 
+0

爲什麼downvote?似乎適當的解決方案 –

+0

你應該在'.Zip()'之前調用'.AsParallel()'以便爲你的查詢應用一些並行性,否則(如你的情況)查詢將按順序執行。在傳遞給'.Zip()'之前,你還應該在'colY'上調用'.AsParallel()',否則會引發異常。 – Verbon