【发布时间】:2020-03-31 22:23:40
【问题描述】:
使用C#我需要转换一个时间序列,例如:
Input: 1 2 1 0 3 2 -> Output: 1 3 4 4 7 9
在前面的示例中,输出是当前输入与之前输入的总和。
我会有不同的转换,所以我从一个抽象类开始:
public abstract class Transformation<TInput, TOutput> {
private IEnumerable<TInput> _inputs { get; set; }
public Transformation(IEnumerable<TInput> inputs) {
_inputs = inputs;
}
public abstract IEnumerable<TOutput> Calculate();
}
所以转换应该是这样的:
public class TransformationOne<Int32, Int32> {
public override IEnumerable<Int32> Calculate();
// Calculate the outputs with all inputs
}
}
如果我有所有输入并想要所有输出,这很好用。
但有时我想实时使用我的课程。
所以我会输入一个新的输入并得到一个新的输出。
实现这一点的最佳方法是什么?
【问题讨论】:
-
实时是什么意思,它与您现在使用的方式有何不同?
-
您可能想要使用 IEnumerable 的神秘表亲 IObservable 和 Reactive Extensions。 github.com/dotnet/reactive
-
大概在您的
Calculate方法中,您正在运行一个循环。您应该能够将循环内容分离到CalculateStep或CalculateNext方法中,并将每个输入从 CalculateNext 推送到可枚举 -
您需要做的是构建一个保持其状态的累加器。您创建它时将状态设置为零。然后,你给它一个值,它将它添加到状态中,更新状态并返回结果。您可能还希望有一个
Clear方法来重置状态。要传递一个序列,你需要初始化它,然后一个一个地传递值。 -
@GSerg 我的意思是实时是我可能一次输入一个输入
标签: c#