C# IEnumerable的和方法扩展<;时间跨度>;
EDIT:对于我的变量名称的混淆,我深表歉意。TotalHours和Hours实际上是时间跨度,我试图总结时间跨度,而不是时间跨度的Hours属性。 我目前正在使用它对表中的小时列(TimeSpan类型)求和: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
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));
}