【问题标题】:math functions on datatable values, using array maybe?数据表值的数学函数,可能使用数组?
【发布时间】:2013-10-12 17:22:23
【问题描述】:

我可以从数据表中获取值(所有大整数)并将数学函数应用于它们吗?例如,假设(所有记录 1):

Column 1 = 10;
Column 2 = 20;
Column 3 = 5;
Column 4 = 60;

现在,我可以根据这些公式做一个数学方程式吗? (column1 + column2)-(column3 * column4)

这可能吗,也许使用数组???

谢谢大家

【问题讨论】:

    标签: c# sql winforms


    【解决方案1】:

    你可以使用这个技巧来获取所有行的结果:

    //Suppose you create your DataTable like this:
    var dt = new DataTable();
    dt.Columns.Add("Col1",typeof(int));
    dt.Columns.Add("Col2",typeof(int));
    dt.Columns.Add("Col3",typeof(int));
    dt.Columns.Add("Col4",typeof(int));
    //Add some rows to test
    dt.Rows.Add(1, 2, 3, 4);
    dt.Rows.Add(2, 2, 2, 2);
    dt.Rows.Add(4, 2, 3, 3);
    
    //Use this method to extract the result, remember that it's just demo
    private List<int> GetResultColumn(DataTable dt){
      dt.Columns.Add("Result",typeof(int));
      dt.Columns["Result"].Expression = "(Col1+Col2)-(Col3*Col4)";
      List<int> result = dt.AsEnumerable().Select(row => row.Field<int>("Result")).ToList();
      dt.Columns.Remove("Result");
      return result;
    }
    //Use it
    var result = GetResultColumn(dt);
    //output  {0, -9, 0, -3}
    

    您始终可以遍历行并以更标准的方式执行此操作,如下所示:

    var result = dt.AsEnumerable()
                   .Select(row=> row.Field<int>("Col1")+row.Field<int>("Col2") 
                                -row.Field<int>("Col3")*row.Field<int>("Col4"))
                   .ToList();//Remove ToList() if you want
    

    更新:

    var newestRow = dt.AsEnumerable().Max(row=>row.Field<int>("ID"));
    var result = newestRow.Field<int>("Col1") + newestRow.Field<int>("Col2") 
                 -newestRow.Field<int>("Col3")* newestRow.Field<int>("Col4");
    

    【讨论】:

    • 我只需要一行,由ID决定?
    • 例如,假设第 1 行中所有列的值将是 1,2,3,4,5,6,7,8,9,10,我需要对那些数字?
    • @tonyb 你的DataTable 会有很多行,但你只想计算1行,那么你如何确定哪一行?通过它的行索引?
    • @tonyb 不明白,你可以确定行的唯一方法是通过它的RowIndex,或者通过一些Filter expression 反对DataTable,现在我真的很困惑什么其实你想要的。
    • 我将选择最新的行(我将通过其 ID 列找到),然后其余列是整数。我需要在数学方程式中使用这些值
    【解决方案2】:

    如果我想做:Result = (1 / Priority) * JobComplex

    示例:如果工程师有以下工作:

    工程师 Jhon:优先级 = 2,JobComplex = 2;那么 (1/2) * 2 = 1

    工程师标记:优先级 = 1,JobComplex = 3;那么 (1/1) * 3 = 3

    那么工程师马克比较忙。

    List<DataRow> theRows = new List<DataRow>();
    decimal relativeBusy = 0;
    
    foreach (DataRow row in EnginnerTable.Rows)
    {    
     //1.- Get list of rows that match an "ID_Enginner"
     theRows = JobsTable.Select("ID_EnginnerAsigned=" + row["ID_Enginner"]).ToList();
     relativeBusy = 0;
    
     //2.- Foreach in "theRows" list, and make the math: Result = (1 / Priority) * JobComplex
     //** Priority and JobComplex are Columns...
     foreach (DataRow row2 in theRows)
     { 
       relativeBusy = relativeBusy + ((1 / Convert.ToDecimal(row2["Priority"])) * Convert.ToDecimal(row2["JobComplex"]));
     }
    
     //3.- Save the result on a List<decimal> to add to "Relative" Column of a Table after...
     jobsrelativeBusy.Add(relativeBusy);
    }
    

    你可以让数学变得更复杂...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多