如何select数据表中列的最小值和最大值?

对于以下数据表列,获取最小值和最大值的最快方法是什么?

AccountLevel 0 1 2 3 
 int minAccountLevel = int.MaxValue; int maxAccountLevel = int.MinValue; foreach (DataRow dr in table.Rows) { int accountLevel = dr.Field<int>("AccountLevel"); minAccountLevel = Math.Min(minAccountLevel, accountLevel); maxAccountLevel = Math.Max(maxAccountLevel, accountLevel); } 

是的,这真的是最快的方法。 使用Linq MinMax扩展将总是比较慢,因为您必须迭代两次。 你可能会使用Linq Aggregate ,但是语法不会比现在更漂亮。

在datatable上的Easiar方法可以是:

 int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty)); 

使用LINQ。 只要将行集合转换为IEnumerable,它就可以在数据表上正常工作。

 List<int> levels = AccountTable.AsEnumerable().Select(al => al.Field<int>("AccountLevel")).Distinct().ToList(); int min = levels.Min(); int max = levels.Max(); 

编辑修复语法; 在DataTable上使用LINQ是很棘手的,聚合函数也很有趣。

是的,可以使用一个查询来完成,但是您需要生成一个结果列表,然后在单独的语句中使用.Min()和.Max()作为聚合函数。

做到这一点的最有效的方法(相信或不相信)是做两个variables并写一个for循环。

 var answer = accountTable.Aggregate(new { Min = int.MinValue, Max = int.MaxValue }, (a, b) => new { Min = Math.Min(a.Min, b.Field<int>("AccountLevel")), Max = Math.Max(a.Max, b.Field<int>("AccountLevel")) }); int min = answer.Min; int max = answer.Max; 

1次迭代,linq样式:)

这对我来说工作得很好

 int max = Convert.ToInt32(datatable_name.AsEnumerable() .Max(row => row["column_Name"])); 

另一种做法是

 int minLavel = Convert.ToInt32(dt.Select("AccountLevel=min(AccountLevel)")[0][0]); 

我不确定在表演部分,但这确实给出了正确的输出

 var min = dt.AsEnumerable().Min(row => row["AccountLevel"]); var max = dt.AsEnumerable().Max(row => row["AccountLevel"]); 

性能方面,这应该是可比的。 使用Select语句和Sort来获取一个列表,然后select第一个或最后一个(取决于您的sorting顺序)。

 var col = dt.Select("AccountLevel", "AccountLevel ASC"); var min = col.First(); var max = col.Last(); 
 Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty); Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty); 

我不知道我的解决scheme如何将性能与以前的答案进行比较。

我知道最初的问题是:在DataTable对象中获取最小值和最大值的最快方法是什么,这可能是一种方法:

 DataView view = table.DefaultView; view.Sort = "AccountLevel"; DataTable sortedTable = view.ToTable(); int min = sortedTable.Rows[0].Field<int>("AccountLevel"); int max = sortedTable.Rows[sortedTable.Rows.Count-1].Field<int>("AccountLevel"); 

这是实现相同结果而不循环的简单方法。 但是性能需要与之前的答案进行比较。 我以为我爱Cylon猫最能回答。