C# 如何创建扩展方法来汇总datatable中泛型约束类型的列
像下面这样的事情可能吗C# 如何创建扩展方法来汇总datatable中泛型约束类型的列,c#,.net,asp.net,c#-3.0,C#,.net,Asp.net,C# 3.0,像下面这样的事情可能吗 public static T Sum<T>(this DataTable dt, string columnName) where T : IEnumerable<decimal>, IComparable<decimal> { return (from c in dt.AsEnumerable() where !c.IsNull
public static T Sum<T>(this DataTable dt, string columnName)
where T : IEnumerable<decimal>, IComparable<decimal>
{
return (from c in dt.AsEnumerable()
where !c.IsNull(columnName)
select c.Field<T>(columnName)
).Sum();
}
public static T Sum(此DataTable dt,string columnName)
其中T:IEnumerable,iComperable
{
返回值(从dt.AsEnumerable()中的c)
其中!c.IsNull(columnName)
选择c.字段(columnName)
).Sum();
}
感觉我就快到了,但还不完全到:/
只是尝试对datatable中的列中的十进制值或int值求和。当前出现编译错误,但我认为这是由于不正确的泛型约束造成的。您可能需要:
where T : decimal
但是有一个通用参数是没有意义的:)试试这个:
public static decimal Sum(this DataTable dt, string columnName) {
return (
from c in dt.AsEnumerable()
where !c.IsNull(columnName)
select c[columnName]
).Sum(value => Convert.ToDecimal(value));
}
列类型必须可转换为十进制
不过,我认为这更紧凑:
public static decimal Sum(this DataTable dt, string columnName) {
return dt.AsEnumerable().
Where(row => !row.IsNull(columnName)).
Sum(row => Convert.ToDecimal(row[columnName]));
}
您还可以为Sum
支持的其他整数类型创建其他版本(double
,float
,int
,long
)
或者,数据表
已经:
public static T Sum(此DataTable dt,string columnName){
var sum=dt.Compute(“sum(“+columnName+”),“”);
if(sum==DBNull.Value)返回默认值(T);
return(T)Convert.ChangeType(sum,typeof(T));
}
没有通用的IEnumerable.Sum()
方法;相反,有离散的IEnumerable.Sum()
,IEnumerable.Sum()
等方法(实现为)。因此,在编译时必须知道调用的Sum
类型
对您来说,这意味着您不能使您的方法成为泛型的(除非您在方法中进行手动类型区分)。您需要为Decimal创建一个版本,为Double创建一个版本,等等。例如,Decimal的版本可能如下所示(未测试,因为我现在没有可用的Visual Studio):
publicstaticdecimalsumdecim(此DataTable dt,stringcolumnname)
{
返回值(从dt.AsEnumerable()中的c)
其中!c.IsNull(columnName)
选择c.字段(columnName)
).Sum();
}
编译错误是……@Jamiec:Sum
不返回IEnumerable
public static T Sum<T>(this DataTable dt, string columnName) {
var sum = dt.Compute("Sum(" + columnName + ")", "");
if (sum == DBNull.Value) return default(T);
return (T)Convert.ChangeType(sum, typeof(T));
}
public static decimal SumDecimal(this DataTable dt, string columnName)
{
return (from c in dt.AsEnumerable()
where !c.IsNull(columnName)
select c.Field<decimal>(columnName)
).Sum();
}