2017-02-05 9 views
1

他のソースから '文字列'の式が与えられているとしましょう。例:Cで計算された列を高速に作成する

NewCalculatedColumn = (Column1 * Column2)/Column3 

私は二重の配列として格納された一部のデータについて計算された列を作成するために、この式を適用したい(またはDataTableのを - 私はここで自由を持っている)メモリに。

この特定の例では、配列/データセットは3列からなり、数千の行を持ちます。 1つのオプションは、データがDataTableに格納されている場合は、hereのようにDataColumn.Expressionsを使用することです。しかし、これは最も効率的な方法ではないかもしれません。どんなフィードバックも非常に高く評価されます。どうもありがとう!

+0

アレイにとどまっているとします。どのように列を識別しますか? doubleの配列、doubleのタプルの配列、または3/4のdoubleメンバを持つオブジェクトの配列ですか、必要な "識別子"(=列名)のマッピング方法はありますか? – dlatikay

+0

Webページを参照してください:https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression(v=vs.100).aspx – jdweng

+0

index equal-ish列名。例インデックス0 =>カラム1、インデックス1 =>カラム2など – cs0815

答えて

1

DataTableは、hereと表示されているように、オブジェクトのリスト(またはより一般的なIEnumerable<T>)よりもはるかに重いデータ構造です。あなたは、次のようになり、オブジェクトのDataTableリストを使用を余儀なくされていない場合

ので、使用することができます。

public ObjectType 
{ 
    public double Column1 { get; set; } 
    public double Column2 { get; set; } 
    public double Column3 { get; set; } 

    // avoid division by zero, adjust zero comparison threshold as needed 
    // also adjust returned value on zero 
    // using C# 6.0 specific syntax. If not available, use get { return } syntax 
    public double NewCalculatedColumn => Math.Abs(Column3) > 0.0001 ? 
     (Column1 * Column2)/Column3 
     : 0.0; 
} 

あなたはDataTableとしてデータをフェッチする場合であっても、あなたは簡単に変換することができますhereのようにList<ObjectType>である。

動的で表現できれば、コメントに基づいて、[EDIT]

、外部ライブラリを使用することができます。例えば。 NCalc

public double NewCalculatedColumn 
    { 
     get 
     { 
      // you can provide a dynamic expression which contains col1, col2 and col3 
      //TODO: add exception handling 
      var e = new Expression($"(col1 * col2)/{col3}"); 
      e.Parameters["col1"] = Column1; 
      e.Parameters["col2"] = Column2; 
      e.Parameters["col3"] = Column3; 
      return e.Evaluate(); 
     } 
    } 
+0

ありがとうございます。課題は、式が動的であること、すなわち3つの列を含むすべてのものになることです。例:column1 + column2 + column3 – cs0815

+0

@csetzkorn - あなたの公式はどのくらい複雑になりますか? – Alexei

+0

潜在的にexp、sin、logを含む可能性がありますが、あなたの編集は非常に面白いです!! – cs0815

関連する問題