【发布时间】:2011-01-27 09:41:25
【问题描述】:
对于以下数据表列,获取最小值和最大值的最快方法是什么?
AccountLevel
0
1
2
3
【问题讨论】:
对于以下数据表列,获取最小值和最大值的最快方法是什么?
AccountLevel
0
1
2
3
【问题讨论】:
数据表的简单方法可能是:
int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty));
【讨论】:
[]的一件事。例如int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty));没有方括号它给了我一个错误。
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 Min 和 Max 扩展总是会变慢,因为你必须迭代两次。您可能会使用 Linq Aggregate,但语法不会比现在更漂亮。
【讨论】:
Int32.MaxValue,“max”应该初始化为Int32.MinValue,这样第一行(如果有的话)总是会更新这些。
使用 LINQ。只要将行集合转换为 IEnumerable,它就可以在数据表上正常工作。
List<int> levels = AccountTable.AsEnumerable().Select(al => al.Field<int>("AccountLevel")).Distinct().ToList();
int min = levels.Min();
int max = levels.Max();
已编辑以修复语法;在 DataTables 上使用 LINQ 很棘手,而且聚合函数也很有趣。
是的,可以通过一个查询完成,但您需要生成一个结果列表,然后在单独的语句中使用 .Min() 和 .Max() 作为聚合函数。
【讨论】:
Distinct 不会加快速度——它必须对每个元素进行哈希处理,而Min 和Max 只是进行比较。
这对我来说很好用
int max = Convert.ToInt32(datatable_name.AsEnumerable()
.Max(row => row["column_Name"]));
【讨论】:
最有效的方法(信不信由你)是创建两个变量并编写一个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 风格 :)
【讨论】:
accountTable 是什么类型?对我来说,DataTable 对象似乎不支持Aggregate...
另一种方法是
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"]);
【讨论】:
Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);
【讨论】:
在性能方面,这应该是可比的。使用 Select 语句和 Sort 获取列表,然后选择第一个或最后一个(取决于您的排序顺序)。
var col = dt.Select("AccountLevel", "AccountLevel ASC");
var min = col.First();
var max = col.Last();
【讨论】:
我不知道我的解决方案如何将性能方面与之前的答案进行比较。
我知道最初的问题是:在 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 Cats 的回答。
【讨论】: