.Net-在数据表中查找最大值

时间:2019-07-05 10:33:40

标签: c# .net linq datatable

我有一个.net DataTable,其中包含各种列。我想找到存储在所有行/表中的 max 值。目前,我正在查看所有行和列,有没有更简单的方法查找最大值(也许使用 LINQ )?

当前代码:

double maxValue = 0;

foreach (DataRow dr in dataTable.Rows)
{
    foreach (DataColumn dc in dataTable.Columns)
    {
        if (dc.ColumnName != "Index" && dr[dc.ColumnName] != DBNull.Value)
        {
            maxValue = Math.Max(maxValue, Convert.ToDouble(dr[dc.ColumnName]));
        }
    }
}

3 个答案:

答案 0 :(得分:3)

从技术上讲,您可以像这样将循环转换为 Linq

  var maxValue = dataTable
   .Rows
   .OfType<DataRow>()
   .SelectMany(dr => dataTable
      .Columns
      .OfType<DataColumn>()
      .Where(dc => dc.ColumnName != "Index" && dr[dc.ColumnName] != DBNull.Value)
      .Select(dc => Convert.ToDouble(dr[dc.ColumnName])))
   .Aggregate(0.0, (s, a) => Math.Max(s, a));

或者如果dataTable至少具有一个非负值,则可以将Aggregate转换为Max

  var maxValue = dataTable
   .Rows
   .OfType<DataRow>()
   .SelectMany(dr => dataTable
      .Columns
      .OfType<DataColumn>()
      .Where(dc => dc.ColumnName != "Index" && dr[dc.ColumnName] != DBNull.Value)
      .Select(dc => Convert.ToDouble(dr[dc.ColumnName])))
   .Max();

但是我怀疑它比原始循环更简单或更容易阅读

答案 1 :(得分:1)

在这里,我们有几个最大化的概念。我们打算获得所有行和所有列的最大值,但Index和null值除外。从这个角度来看,我们计算最大值的最大值,即每个记录都有一个最大值,并且我们打算找到这些最大值的最大值。因此,我们需要将记录最大值的计算实现为自定义函数,然后编写LINQ选择来计算这些最大值的最大值。外部用法很简单,但是我们要放入里面:

myQueryableVariable.Select(/*Here comes the magic*/).Max()

非常好。那么,魔术会是什么?您当然可以写一个custom function。您也可以使用dynamic query library。您将需要实现一个功能,该功能将针对每个记录进行评估。这是更简单的方法吗?仅在初次阅读时,它更容易阅读,但更难实现。这种方法的真正作用是将功能与用例分开,

  • 以不同的方式使它在不同的子句中可重用
  • 使该功能易于替换

在不同的子句处重用非常好,例如,您可以使用Where条件来检查给定行的列值的最大值是否大于10。

此外,您可以替换您的功能。如果您需要类似地计算其他值,例如最小值,那么您要做的就是实现最小值函数并使用它。

多年来,我没有安装.NET环境,因此我无法测试编写的代码,因此,如果此答案有任何问题,请在评论部分告知我。

答案 2 :(得分:0)

假设“索引”列中没有任何非DBNull值:

double maxValue = dataTable.Rows.Cast<DataRow>().Max(r => r.ItemArray.Where((o, i) => 
        i != dataTable.Columns["Index"].Ordinal && o != DBNull.Value).Max(Convert.ToDouble));