DataTable动态计算列

时间:2017-05-15 11:54:58

标签: c# datatable calculated-columns

我需要一种方法来更新计算出的Datatable的基于其他字符串列中的字符串的列。 例如:

x          y         FormulaCol         ComputedCol
------------------------------          -----------
2          5         x+y                7
2          5         x*y                10

我知道我可以使用for循环并计算结果列:

  for (int i = 0; i < DT.Rows.Count; i++){
string formula=DT.Rows[i]["FormulaCol"].ToString().Replace("x",DT.Rows[i]["x"]).Replace("y",DT.Rows[i]["y"])
DT.Rows[i]["ComputedCol"] =(int)DT.Compute(formula , "")
  }

还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

如果你不想使用循环,试试这个......

DT = DT.AsEnumerable()
       .Select(
                row =>
                { 
                  row["ComputedCol"] = (int)DT.Compute(row["FormulaCol"].ToString()
                             .Replace("x", row["x"].ToString())
                             .Replace("y", row["y"].ToString()), "");
                  return row;
                 }
               ).CopyToDataTable<DataRow>();

答案 1 :(得分:1)

一个简单但很长的解决方案:
这就是你的表格的样子,

x          y         FormulaCol         ComputedCol
------------------------------          -----------
2          5         +                7
2          5         *                10

和您的代码

for (int i = 0; i < DT.Rows.Count; i++){
     switch(DT.Rows[i]["FormulaCol"].ToString()){
         case "+":
             int formula=(int) DT.Rows[i]["x"] + (int) DT.Rows[i]["y"];
             DT.Rows[i]["ComputedCol"] = formula;
             break;
         case "-":
             int formula=(int) DT.Rows[i]["x"] - (int) DT.Rows[i]["y"];
             DT.Rows[i]["ComputedCol"] = formula;
             break;
         case "*":
             int formula=(int) DT.Rows[i]["x"] * (int) DT.Rows[i]["y"];
             DT.Rows[i]["ComputedCol"] = formula;
             break;
         case "/":
             int formula=(int) DT.Rows[i]["x"] / (int) DT.Rows[i]["y"];
             DT.Rows[i]["ComputedCol"] = formula;
             break;
     }
 }

希望这有帮助!

答案 2 :(得分:0)

 for (int i = 0; i < DT.Rows.Count; i++){

string formula=DT.Rows[i]["FormulaCol"].ToString()
 for (int j = 0; j < DT.Columns.Count; j++){

 furmula=formula.Replace(DT.Columns[j].Name ,DT.Rows[i][j].ToString())

 }

DT.Rows[i]["ComputedCol"] =(int)DT.Compute(formula , "")
}