0

我想在列表上编写一个扩展方法,对列表项和提供的双精度执行算术运算,然后将结果写回列表中。例子:

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 - 只是为了避免疑问。

任何想法表示赞赏。

谢谢。

4

2 回答 2

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
            };
 }
于 2013-05-10T10:46:41.293 回答
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);
    }
}
于 2013-05-10T10:50:22.193 回答