C# .Net-在DataTable中查找最大值

C# .Net-在DataTable中查找最大值,c#,.net,linq,datatable,C#,.net,Linq,Datatable,我有一个.net数据表,它有不同的列。我想找到所有行/表中存储的最大值。目前我正在浏览所有的行和列,是否有更简单的方法可以使用LINQ找到最大值 当前代码: 从技术上讲,您可以像这样将循环转换为Linq: var maxValue = dataTable .Rows .OfType<DataRow>() .SelectMany(dr => dataTable .Columns .OfType<DataColumn>()

我有一个.net数据表,它有不同的列。我想找到所有行/表中存储的最大值。目前我正在浏览所有的行和列,是否有更简单的方法可以使用LINQ找到最大值

当前代码:


从技术上讲,您可以像这样将循环转换为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));

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

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

myQueryableVariable.Select(/*Here comes the magic*/).Max()
非常好。那么,魔法是什么呢?你当然可以写一本书。您也可以使用。您需要实现一个函数,该函数将对每个记录进行评估。这是一种更简单的方法吗?它更容易阅读,但更难实现,然而,只有在第一次。这种方法的真正威力在于它将功能与其用例分离开来,即:

使它以非常不同的方式在不同的子句中可重用 使功能易于更换 在不同的子句中重用是非常好的,例如,您可以使用Where条件来检查给定行的列值的最大值是否大于10

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


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

假设索引列中没有任何非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));

使用面向列的DBMS将是最佳选择。旁注:您可能需要double maxValue=double.NegativeInfinity;而不是双maxValue=0;有趣的是,我同意原始循环将更易于阅读。谢谢你的回答,很好的回答。然而,如果我们设法将功能从用例中分离出来,那么我们将获得更多的好处。
myQueryableVariable.Select(/*Here comes the magic*/).Max()
double maxValue = dataTable.Rows.Cast<DataRow>().Max(r => r.ItemArray.Where((o, i) => 
        i != dataTable.Columns["Index"].Ordinal && o != DBNull.Value).Max(Convert.ToDouble));