C# 具有linq的列表中的线性回归
我有一个形成坡道系列的“台阶”列表。每个步骤都有一个C# 具有linq的列表中的线性回归,c#,linq,C#,Linq,我有一个形成坡道系列的“台阶”列表。每个步骤都有一个开始值、一个结束值和一个持续时间。下面是一个示例图: 保证后续步骤的开始值等于结束值。这是一个单调的函数 现在我需要得到给定时间的值。我已经有了一个使用老foreach的工作实现,但是我想知道是否有一些聪明的方法可以使用linq来实现它。也许有人想用GetValueAt函数代替它 类程序 { 类步 { 来自{get;set;}的公共双精度 公共双精度到{get;set;} 公共整数持续时间{get;set;} } 静态void Main(字符
开始值
、一个结束值
和一个持续时间
。下面是一个示例图:
保证后续步骤的开始值等于结束值。这是一个单调的函数
现在我需要得到给定时间的值。我已经有了一个使用老foreach的工作实现,但是我想知道是否有一些聪明的方法可以使用linq
来实现它。也许有人想用GetValueAt
函数代替它
类程序
{
类步
{
来自{get;set;}的公共双精度
公共双精度到{get;set;}
公共整数持续时间{get;set;}
}
静态void Main(字符串[]参数)
{
var步骤=新列表
{
新步骤{From=0,To=10,Duration=20},
新步骤{From=10,To=12,Duration=10},
};
常数双重公差=0.001;
//测试转折点
Assert(Math.Abs(GetValueAt(steps,0)-0) 如果(秒您可以尝试聚合:
static double GetValueAt(IList<Step> steps, int seconds)
{
var (value, remaining) = steps.Aggregate(
(Value: 0d, RemainingSeconds: seconds),
(secs, step) =>
{
if (secs.RemainingSeconds > step.Duration)
{
return (step.To, secs.RemainingSeconds - step.Duration);
}
else
{
return (secs.Value + ((step.To - step.From) / step.Duration) * secs.RemainingSeconds, 0);
}
});
return remaining > 0 ? double.NaN : value;
}
static double GetValueAt(IList步数,int秒)
{
var(值,剩余)=步数。聚合(
(值:0d,剩余秒数:秒),
(秒,步)=>
{
如果(秒剩余秒>步长持续时间)
{
返回(步长至,秒剩余秒-步长持续时间);
}
其他的
{
返回(秒值+((步到-步从)/步持续时间)*秒剩余秒,0);
}
});
返回剩余>0?双精度。NaN:值;
}
让我们暂时忽略linq
对于少量的步骤,您的foreach方法非常有效……此外,如果您可以管理访问端以支持有序顺序访问而不是随机访问,您可以优化访问所需步骤的方式以计算值……请考虑一个迭代器,该迭代器仅在请求点不在当前位置时才向前移动新界阶
如果你的步数越来越大,你需要以随机顺序访问这些值,你可能需要引入一个平衡的树结构来搜索正确的步数元素啊,我从来没有想到要将聚合与元组结合起来。谢谢你的好主意!谢谢你!我只是想知道linq方法是否可行也许foreach方法对其他人来说也更具可读性。