Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对列表项执行算术运算的列表的扩展方法_C# - Fatal编程技术网

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

C# 对列表项执行算术运算的列表的扩展方法,c#,C#,我想在列表上编写一个扩展方法,该方法对列表项和提供的double执行艺术运算,然后将结果写回列表。例如: public class Datum { public DateTime DateTime; public double Value; } public static class DateExt { public static double Average(this IEnumerable<Datum> @this) { retur

我想在列表上编写一个扩展方法,该方法对列表项和提供的double执行艺术运算,然后将结果写回列表。例如:

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;
    }
}
这将返回两个日期之间所有项目的总和。 现在,我想创建一个扩展方法,它接受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;
    }
公共静态双加法(this IEnumerable@this,double val)
{
返回@this.(datum=>datum.Value)+=val;
}
但这不起作用

因此,如果列表项为10且val=5,则相同位置的更新列表项应为15-为避免疑问

欢迎提出任何意见


谢谢。

您说要更新集合,所以我假设这是一个破坏性操作(即,它修改输入)

公共静态IEnumerable加法(this IEnumerable@this,double val){
foreach(在@this中的var数据){
基准值+=val;
}
返回@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
            };
 }
公共静态IEnumerable加法(this IEnumerable@this,double val){
从@this中的基准返回
选择新基准面{
DateTime=datum.DateTime,
值=基准。值+值
};
}

编写一个更通用的版本来接受一个
操作怎么样

list.Do(d => d.Value += 1000); 

公共静态部分类扩展
{
公共静态void Do(此IEnumerable e,Action-Action)
{
foreach(e中的var项)
行动(项目);
}
}

为什么它不起作用?错误消息是什么,或者它的行为是什么,因此您认为它是不正确的?除此之外-您的代码首先看起来不正确-
@这是(数据…
这是什么意思?你不给任何方法打电话,你说它“不起作用”。它是否未能完成您期望的操作,或者它是否抛出异常,或者只是默默地失败?它表示需要标识符。
Addition()
返回的值应该是多少?@MatthewWatson OP表示一个更新的列表“因此,如果列表项为10且val=5,则相同位置的更新列表项应该是15”,这比我更准确,我正要给我的答案添加一个更通用的解决方案!要么这样,要么他想返回累加(已将
val
添加到所有内容中)。@MatthewWatson随后可以使用
Sum()
来回答,例如
list.Addition(5).Sum()
谢谢。我想这就行了。如果我必须在一个长长的列表中多次这样做,您认为这对性能有何影响?谢谢again@npvh我不确定
添加方法是否会导致性能问题。问题在于
InTimeRange
方法,因为它将迭代整个列表。您可能希望考虑使用二进制搜索在DATE字段上使用SordDead来建立起始索引和结束索引。
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
            };
 }
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);
    }
}