Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# IEnumerable的和方法扩展<;时间跨度>;_C#_Linq_Ienumerable_Extension Methods - Fatal编程技术网

C# IEnumerable的和方法扩展<;时间跨度>;

C# IEnumerable的和方法扩展<;时间跨度>;,c#,linq,ienumerable,extension-methods,C#,Linq,Ienumerable,Extension Methods,EDIT:对于我的变量名称的混淆,我深表歉意。TotalHours和Hours实际上是时间跨度,我试图总结时间跨度,而不是时间跨度的Hours属性。 我目前正在使用它对表中的小时列(TimeSpan类型)求和: TotalHours = MainGridTable.Select(x => x.Hours).Aggregate((x,y) => x.Add(y)); 我尝试过像这样对IEnumerable进行求和扩展,但不起作用: public static TimeSpan Sum

EDIT:对于我的变量名称的混淆,我深表歉意。TotalHours和Hours实际上是时间跨度,我试图总结时间跨度,而不是时间跨度的Hours属性。

我目前正在使用它对表中的小时列(TimeSpan类型)求和:

TotalHours = MainGridTable.Select(x => x.Hours).Aggregate((x,y) => x.Add(y));
我尝试过像这样对IEnumerable进行求和扩展,但不起作用:

public static TimeSpan Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, TimeSpan> selector) 
{            
    return source.Aggregate(((t1, t2) => t1.Add(t2));         
}
然后,我尝试将我的非泛型Sum扩展设置为如下所示的可枚举,但上面的返回语句并没有识别它,它只是不断地请求一个十进制参数

    public static TimeSpan Sum(this IEnumerable<TimeSpan> source) {
        TimeSpan sum = new TimeSpan(0, 0, 0);
        foreach (TimeSpan v in source) {
            if (v != null) sum.add(v);
        }
        return sum;
    }
公共静态时间跨度总和(此IEnumerable源){
TimeSpan总和=新的TimeSpan(0,0,0);
foreach(源中的时间跨度v){
如果(v!=null)和加(v);
}
回报金额;
}

我不太精通函数、扩展和泛型。我的错误是什么?我如何才能做到这一点?

编辑感谢您澄清了您试图实现的目标。我仍然不确定我是否真的得到了它,所以这将是我最后一次尝试:-)

还要注意的是,
TimeSpan
是一种值类型(
struct
),因此不能使用
null
。因此,在代码中对null的检查是非常有用的

LINQ版本的外观如下所示:

    public static TimeSpan Sum(this IEnumerable<TimeSpan> source)
    {
        TimeSpan sum = new TimeSpan(0, 0, 0);
        return source.Aggregate(sum, (current, v) => current.Add(v));
    }
公共静态时间跨度总和(此IEnumerable源)
{
TimeSpan总和=新的TimeSpan(0,0,0);
返回source.Aggregate(sum,(current,v)=>current.Add(v));
}

同样,您需要使用
Add
方法的结果。

请发布一篇文章。您当前的代码有几个不相关的错误,这些错误可能不会出现在实际代码中。如果只想对IEnumerable中每个时间跨度的值求和,则很难判断实际问题是什么。TotalHours=MainGridTable.Sum(x=>x.Hours)。你想要的东西超过总数吗hours@MrinalKamboj我认为
Hours
是一个类型为
TimeSpan
的属性,OP并不是对
TimeSpan.Hours
属性求和。还是我误解了你的评论?@hvd据我所知,OP希望为给定的TimeSpan添加Hours或TotalHours属性,这就是Select和Aggregate所做的,稍后可以将其转换为TimeSpan作为最终值result@MrinalKamboj是的,我认为这完全不是OP想要的。我认为OP有
类MainGridRow{…public TimeSpan Hours{get{…}set{…}}{code>。OP正在从
MainGridTable
中进行选择,这一事实对我来说强烈暗示这是一个类似
DataTable
的结构,具有多个列,其中一个列可能具有
TimeSpan
类型:我添加了一个编辑,试图消除混淆。我确实在试图总结时间跨度,而不是它们的时间属性。问题是,我试图创建一个可以应用于任何IEnumerable的Sum扩展,并使用lambda选择每个枚举项的TimeSpan属性,从而返回另一个TimeSpan。谢谢你提醒我时间跨度的不变性,那以后会让我头疼的。谢谢你的帮助,这很有效。我还偶然发现了一个相关的搜索,我不敢相信我之前没有找到这个。我只是不知道如何使用函数的选择器参数。
public static TimeSpan Sum(this IEnumerable<TimeSpan> source) {
    TimeSpan sum = new TimeSpan(0, 0, 0);
    foreach (TimeSpan v in source) {
        sum = sum.Add(v);
    }
    return sum;
}
public static TimeSpan Sum(this IEnumerable<TimeSpan> source) {
    TimeSpan sum = new TimeSpan(0, 0, 0);
    foreach (TimeSpan v in source) {
        sum = sum.Add(v);
    }
    return sum;
}
    public static TimeSpan Sum(this IEnumerable<TimeSpan> source)
    {
        TimeSpan sum = new TimeSpan(0, 0, 0);
        return source.Aggregate(sum, (current, v) => current.Add(v));
    }