【发布时间】:2016-02-01 11:01:49
【问题描述】:
编辑:对于我的变量名称造成的混淆,我深表歉意。 TotalHours 和 Hours 确实是 TimeSpan,我试图总结 TimeSpan,而不是 Timespan 的 Hours 属性。
我目前正在使用它来汇总表中的 Hours 列(TimeSpan 类型):
TotalHours = MainGridTable.Select(x => x.Hours).Aggregate((x,y) => x.Add(y));
我试过像这样对 IEnumerable 进行 Sum 扩展,但它不起作用:
public static TimeSpan Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, TimeSpan> selector)
{
return source.Aggregate(((t1, t2) => t1.Add(t2));
}
我搜索了.NET源代码,发现现有的Sum方法返回为:
return Enumerable.Sum(Enumerable.Select(source, selector));
然后我尝试像这样对 Enumerable 进行非泛型 Sum 扩展,但上面的 return 语句没有识别它,它只是不断要求十进制参数。
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;
}
我不太精通函数、扩展和泛型。我的错误是什么,我该如何完成这项工作?
【问题讨论】:
-
请发帖minimal reproducible example。您当前的代码有几个不相关的错误,这些错误可能不会出现在您的真实代码中。这使得很难说出实际问题是什么。
-
TotalHours = MainGridTable.Sum(x => x.Hours),如果您只想对 IEnumerable 中每个 TimeSpan 的值求和。你想要什么超出小时的总和
-
@MrinalKamboj 我认为
Hours是TimeSpan类型的属性,并且OP 没有对TimeSpan.Hours属性求和。还是我误解了你的评论? -
@hvd 据我了解,OP 希望为给定的 TimeSpan 添加 Hours 或 TotalHours 属性,这就是 Select 和 Aggregate 所做的,稍后可以将其转换为 TimeSpan 作为最终结果
-
@MrinalKamboj 是的,这完全不是我认为 OP 正在尝试的。我认为 OP 有
class MainGridRow { ... public TimeSpan Hours { get { ... } set { ... } } ... }。 OP 从MainGridTable中选择这一事实强烈地向我暗示这是一个类似DataTable的结构,具有多列,其中一个可能具有TimeSpan类型。 :)
标签: c# linq ienumerable extension-methods