繁体   English   中英

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

[英]How to select min and max values of a column in a datatable?

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

AccountLevel  
0  
1  
2  
3 

对数据表的Easiar方法可能是:

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 MinMax扩展将总是较慢,因为您必须迭代两次。 您可以使用Linq Aggregate ,但语法不会比现在更漂亮。

使用LINQ。 只要将rows集合转换为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()作为单独语句中的聚合函数。

这对我来说很好

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风格:)

另一种方法是这样做

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的回答最多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM