2016-05-21 7 views
0

次のコードを使用して、2つの別々の配列の値を使用していくつかの計算を試みます。私は最後のステップとして値のリストを集計しようとしていましたが、プログラムを実行するたびにリストに1セットの値しかありません。 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()'に渡す前に、 '.AsParallel()'を 'colY'で呼び出す必要があります。そうでなければ例外がスローされます。 – Verbon