1

現在、これに似た関数を使用して、いくつかの列のデータを計算しています。

DataTable data = RetrieveDataTable();
var value = data.Compute(
    "AVG(Important_Variable)", 
    "(Distance > 1230 and Distance < 1760) OR (Distance > 4710 and Distance < 5400)"
);

これは機能していますが、遅いです。同じことを達成するためのより速い方法はありますか? さまざまなデータ型はまったく問題ありません。私は DataTables と結婚していません。

4

2 に答える 2

2

DataTable にデータを入力する方法はわかりませんが、 DataTable にデータを入力するときに、要素の合計と数 (平均を計算する必要があります) を累積する方法が 1 つあります。次のようなものです:

int sum;
int count;

for(something) //Loop that populates the data table
{
   .
   .
   var Important_Variable = Read something
   Populate(Important_Variable)
   count++;
   if((Distance > 1230 and Distance < 1760) || (Distance > 4710 and Distance < 5400))
      sum += Important_Variable;
   .
   .
}
var avg = sum/count;

このようにして、事後にフィルターを実行する必要はありません (これは時間のかかる部分であると確信しています)。

于 2013-10-03T19:38:33.630 に答える
1
  1. すべてを POCO オブジェクトにマップします。
  2. 計算を行う (読み取り専用) get プロパティを記述します。

これが基本的な ORM マッパーです (別名、POCO を作成します)

DataTable が DataReader よりも速い理由

オブジェクトの他のプロパティを使用する readonly (get; only) プロパティを追加します。

計算が「コストがかかり」、何度も読む場合は、この「nullable」トリックを使用できます。

public class Employee
{

    public DateTime BirthDate { get; set; }
    public DateTime HireDate { get; set; }

    TimeSpan? _difference = null;
    public TimeSpan Difference
    {
        get
        {
            TimeSpan returnValue;
            if (this._difference.HasValue)
            {
                returnValue = this._difference.Value;
            }
            else
            {
                   /* COSTLY CALCULATION HERE , ONE TIME */
                this._difference = this.HireDate.Subtract(this.BirthDate);
                   /* End COSTLY Calculation */

                returnValue = this._difference.Value;
            }
            return returnValue;
        }
    }

}
于 2013-10-03T19:25:20.847 に答える