繁体   English   中英

C# 将多个集合合二为一

[英]C# Join multiple collections into one

我在将多个集合合并为一个时遇到问题 -> 我需要将来自多个传感器的数据集合连接到一个集合中,以便输出文件中所有传感器的每次值,fe 如果一个传感器没有数据,它将用 0 填充文件帮帮我,我很绝望

public class MeasuredData
{
    public DateTime Time { get; }
    public double Value { get; }        

    public MeasuredData(DateTime time, double value)
    {
        Time = time;
        Value = value;
    }
}

假设您有要加入的内容,您可以使用Enumerable.Join

var result = collection1.Join(collection2,
/* whatever your join is */   x => x.id,
                              y => y.id,
                              (a, b) => new {x = a, y = b}

foreach(var obj in result)
{
    Console.WriteLine($"{obj.x.id}, {obj.y.id}")
}

这将打印两个对象的 ID,但它们可以访问任何内容。 该链接可能更有帮助,但您没有给我们提供太多信息

如果您有多个包含List<MeasuredData>变量,每个传感器一个,您可以将它们分组到一个数组中,然后查询它们。

首先,如果您在获取它们时尚未规范化它们,则您需要一个扩展方法来对每个 @jdweng 的DateTime进行四舍五入。

public static DateTime Round(this DateTime dt, TimeSpan rnd) {
    if (rnd == TimeSpan.Zero)
        return dt;
    else {
        var ansTicks = dt.Ticks + Math.Sign(dt.Ticks) * rnd.Ticks / 2;
        return new DateTime(ansTicks - ansTicks % rnd.Ticks);
    }
}

现在您可以创建传感器读数List数组:

var sensorData = new[] { sensor0, sensor1, sensor2, sensor3 };

然后您可以提取所有舍入时间以创建表格的左侧:

var roundTo = TimeSpan.FromSeconds(1);
var times = sensorData.SelectMany(sdl => sdl.Select(md => md.Time.Round(roundTo)))
                      .Distinct()
                      .Select(t => new { Time = t, Measurements = Enumerable.Empty<MeasuredData>() });

然后你可以将每个传感器加入到表中:

foreach (var oneSensorData in sensorData)
    times = times.GroupJoin(oneSensorData, t => t.Time, md => md.Time.Round(roundTo),
        (t, mdj) => new { t.Time, Measurements = t.Measurements.Concat(mdj) });

最后,您可以将每一行转换为时间和按时间排序的测量List

var ans = times.Select(tm => new { tm.Time, Measurements = tm.Measurements.ToList() })
               .OrderBy(tm => tm.Time);

如果您想将测量List展平到答案中的字段,您需要使用另一个Select手动执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM