我想在列表上编写扩展方法,对列表项和提供的double执行artithmetic操作,然后将结果写回列表。例如:
public class Datum
{
public DateTime DateTime;
public double Value;
}
public static class DateExt
{
public static double Average(this IEnumerable<Datum> @this)
{
return @this.Average(datum => datum.Value);
}
public static double Sum(this IEnumerable<Datum> @this)
{
return @this.Sum(datum => datum.Value);
}
public static IEnumerable<Datum> InTimeRange(this IEnumerable<Datum> @this, DateTime start, DateTime end)
{
return from datum in @this
where (start <= datum.DateTime && datum.DateTime < end)
select datum;
}
}
这让我可以做到以下几点:
return somelist.InTimeRange(startdate, enddate).Sum()
将返回两个日期之间所有项目的总和。 我现在想创建一个带有double的扩展方法并相应地更新列表。例如:
return somelist.InTimeRange(startdate, enddate).Addition(double val)
应该为列表中开始日期和结束日期之间的每个项目添加val。我试过这个:
public static double Addition(this IEnumerable<Datum> @this, double val)
{
return @this.(datum => datum.Value)+= val;
}
但这不起作用。
因此,如果列表项为10且val = 5,则同一位置的更新列表项应为15 - 只是为了避免疑问。
任何想法都表示赞赏。
感谢。
答案 0 :(得分:2)
你说更新集合所以我假设这是一个破坏性的操作(即它修改输入)
public static IEnumerable<Datum> Addition(this IEnumerable<Datum> @this, double val) {
foreach (var datum in @this) {
datum.Value += val;
}
return @this;
}
替代非破坏性版本
public static IEnumerable<Datum> Addition(this IEnumerable<Datum> @this, double val) {
return from datum in @this
select new Datum {
DateTime = datum.DateTime,
Value = datum.Value + val
};
}
答案 1 :(得分:0)
如何编写一个接受Action
的更多通用版本?
list.Do(d => d.Value += 1000);
public static partial class Extensions
{
public static void Do<T>(this IEnumerable<T> e, Action<T> action)
{
foreach(var item in e)
action(item);
}
}