Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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# 具有linq的列表中的线性回归_C#_Linq - Fatal编程技术网

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方法对其他人来说也更具可读性。