2

スプレッドシートのすべてのセルをプログラムでループし、数値の文字列値を実際の数値に変換するC#コードがいくつかあります。動作しているように見えますが、実行速度はかなり遅くなります(40列×3000行のスプレッドシートでは、実行に1分以上かかります)。

private void SetNumberStringsToValues(Excel.Range range)
  {
     object[,] values = range.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);

     Parallel.For(1, range.Columns.Count, i =>
     {
        for (var j = 1; j < range.Rows.Count; j++)
        {
           var doubleValue = 0.0;
           if (double.TryParse(values[j, i].ToString(), out doubleValue))
              values[j, i] = doubleValue;
        }
     });
     range.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, values);
  }

誰かがこれを行うためのより効率的な方法を知っていますか?

4

1 に答える 1

4

ループ内でran​​ge.Rows.Countを呼び出す代わりに、行数をキャッシュしてみてください。複数のスレッドからアクセスすると、インスタンス内rangeで競合が発生する可能性があります。

また、なぜ列挙を0ではなく1から開始するのか興味がありますか?最初の行と列を見逃しませんか?

...

var columns = range.Columns.Count;
var rows = range.Rows.Count;

Parallel.For(1, columns + 1, i => 
{ 
   for (var j = 1; j <= rows; j++) 
   { 
      var doubleValue = 0.0; 
      if (double.TryParse(values[j, i].ToString(), out doubleValue)) 
         values[j, i] = doubleValue; 
   } 
});

...
于 2012-07-01T17:21:43.857 に答える