C# 创建时间序列列表

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,

我需要创建一个时间序列,包含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, 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]) }));