C# 创建时间序列列表
我需要创建一个时间序列,包含10个测量点1到10的200个观测值,并使用C7将所有内容连接到一个列表中:C# 创建时间序列列表,c#,C#,我需要创建一个时间序列,包含10个测量点1到10的200个观测值,并使用C7将所有内容连接到一个列表中: var a = Enumerable.Range(1, 200).Select(x => new Measure { MeasureTypeId = 1, Created = DateTime.Now.AddDays(x), Value = (Decimal)(80 * random.NextDouble() + 40) }); var b = Enumerable.Range(1,
var a = Enumerable.Range(1, 200).Select(x => new Measure { MeasureTypeId = 1, Created = DateTime.Now.AddDays(x), Value = (Decimal)(80 * random.NextDouble() + 40) });
var b = Enumerable.Range(1, 200).Select(x => new Measure { MeasureTypeId = 2, Created = DateTime.Now.AddDays(x), Value = (Decimal)(20 * random.NextDouble() + 30) });
// Other measures
var result = a.Union(b).Union(c). ...
从一个度量到另一个度量的变化是增量的度量,参数80和40到20和30到
有没有办法简化此代码?使用带有数组或元组列表的for循环或自定义类型来保存参数,如下所示:
var result = Set.Empty; // Or whatever you use
Tuple<int, int>[] params = {
new Tuple<int, int>(80, 40),
new Tuple<int, int>(20, 30),
// and so on
}
for(int i = 0; i < N; i++) {
result.Union(Enumerable.Range(1, 200).Select(x => new Measure { MeasureTypeId = i + 1, Created = DateTime.Now.AddDays(x), Value = (Decimal)(params[i].Item1 * random.NextDouble() + params[i].Item2) }));
}
// LINQ version
var result = Enumerable.Range(1, N).SelectMany(x => Enumerable.Range(1, 200), (t, n) => new Measure {
MeasureTypeId = t,
Created = DateTime.Now.AddDays(n),
Value = (decimal)(params[t - 1].Item1 * random.NextDouble() + params[t - 1].Item2)
});
如果你愿意的话,你可以使用C7的糖化元组语法,我对它还不是很精通
如果参数是系列的一部分,则可以完全跳过元组
从中借用和修改的LINQ版本。不确定如何计算Measure.Value,但是可以使用SelectMany将两个枚举有效地交叉连接在一起:
var result = Enumerable.Range(1, 10)
.SelectMany(x => Enumerable.Range(1, 200), (t, n) => new Measure {
MeasureId = ((t - 1) * 200) + n,
MeasureTypeId = t,
Created = DateTime.Now.AddDays(n),
Value = (decimal)(80 * random.NextDouble() + 40) // Replace with your logic
});
您可以这样做:
var random = new Random();
int[] multipliers = { 80, 20, 30, 50 };
int[] add = { 40, 30, 10, 20 };
var result = Enumerable.Range(1,4).SelectMany(t =>
Enumerable.Range(1, 200).Select(x =>
new Measure {
MeasureTypeId = t,
Created = DateTime.Now.AddDays(x),
Value = (Decimal)(multipliers[t-1] * random.NextDouble() + add[t-1]) }));
..参数80和40至20以及30至为了什么?下一个值是什么?他们是如何决定的?你还有多少尺寸?我可以有20到40个尺寸。。。这个想法可能会有一个变量,它保存每个MeasureType的最小值和最大值,然后用它构建时间序列……您希望简化代码的哪一部分?生成模拟随机数据?@mukh1n是。我想用一个变量来保存每个MeasureId的2个参数,然后在此基础上构建时间序列。我认为这对于code review SE论坛来说是一个更好的问题,因为根据您的问题陈述,您实际上没有任何问题。你应该澄清你在寻找什么,尽管这个问题很模糊,我仍然不清楚你想做什么或要求什么。度量也必须改变。。。是否可以使用Linq而不是循环?只是问…@MiguelMoura编辑了我的答案,加入了LINQ版本。虽然这没有回答问题,但我使用了你答案的修改版本作为我答案的扩展,并进行了投票。如果您希望我还原编辑,我可以。更新为MeasureId@ChrisPickford如果你认为简单代码是单行代码,那你就错了。我不这么认为,但是你的答案比原来的问题复杂得多。
var random = new Random();
int[] multipliers = { 80, 20, 30, 50 };
int[] add = { 40, 30, 10, 20 };
var result = Enumerable.Range(1,4).SelectMany(t =>
Enumerable.Range(1, 200).Select(x =>
new Measure {
MeasureTypeId = t,
Created = DateTime.Now.AddDays(x),
Value = (Decimal)(multipliers[t-1] * random.NextDouble() + add[t-1]) }));