C# 对列表项执行算术运算的列表的扩展方法
我想在列表上编写一个扩展方法,该方法对列表项和提供的double执行艺术运算,然后将结果写回列表。例如: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
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);
}
}