Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建扩展方法来汇总datatable中泛型约束类型的列_C#_.net_Asp.net_C# 3.0 - Fatal编程技术网

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();
}