这就是我尝试过的:
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()]);
}
答案 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;