如何获得DataTable列的最小值?

时间:2012-02-21 14:45:37

标签: c#

这就是我尝试过的:

Decimal tempLow = 0;

for (int irow = 0; irow < dtRep.Rows.Count; irow++)
{
    DataRow row = dtRep.Rows[irow];
    if (irow == 0)
        tempLow = Convert.ToDecimal(row[col.ToString()]);

    if (tempLow > Convert.ToDecimal(row[col.ToString()]))  
        tempLow = Convert.ToDecimal(row[col.ToString()]);
}                                       

2 个答案:

答案 0 :(得分:3)

您可以使用LINQ获取最低值而无需繁琐的循环。

var lowest = dtRep.AsEnumerable()
            .Where(r=> r.Field<Decimal>(col) > 0)
            .Min(r  => r.Field<Decimal>(col));

如果您使用的是.NET 2.0或更低版本,则可以使用DataTable.Compute

lowest = System.Convert.ToDecimal(dtRep.Compute("MIN(ColName)", "ColName > 0"));

编辑:正如对我的回答的评论中所提到的,你也在迭代DataTable的所有DataColumns,因此列名是动态的。

尝试循环所有列的方法,检查列的DataType是否为“numeric”,并检测所有列中所有行的最低值:

var numericTypes = 
   new [] { typeof(Byte),   typeof(Decimal), typeof(Double),
            typeof(Int16),  typeof(Int32),   typeof(Int64),  typeof(SByte),
            typeof(Single), typeof(UInt16),  typeof(UInt32), typeof(UInt64)};

Decimal lowest=Decimal.MaxValue;

foreach(DataColumn col in dtRep.Columns) {
    if(numericTypes.Contains(col.DataType)){
        var exp=string.Format("MIN({0})"  , col.ColumnName);
        var filter=string.Format("{0} > 0", col.ColumnName);
        var d = Convert.ToDecimal(dtRep.Compute(exp, filter));
        if(d < lowest) lowest = d;
    }
}

注意:如果您知道所有列都是数字或包含可以转换为小数的字符串,请排除类型检查。 (如果DataColumn的DataTable.Compute是一个字符串,{DataType将不会抛出错误,但如果该字符串不可转换,则Convert.ToDecimal将会抛出错误

最后:这是“强力”方式,迭代DataTable中的所有值并尝试将它们解析为十进制:

foreach(DataRow row in dtRep.Rows){
    foreach(Object value in row.ItemArray) {
        try {
            Decimal d = Convert.ToDecimal(value);
            if(d > 0 && d < lowest) lowest = d;
        } catch(Exception ex) { }
    }
}

答案 1 :(得分:0)

所以你试图计算最小的非零值?

decimal value = Convert.ToDecimal(row[col.ToString()];
if(tempLow > value && value > 0.0m)
    tempLow = value;