对列表项执行算术运算的列表的扩展方法

时间:2013-05-10 10:41:33

标签: c#

我想在列表上编写扩展方法,对列表项和提供的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 - 只是为了避免疑问。

任何想法都表示赞赏。

感谢。

2 个答案:

答案 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);
    }
}