C#将多个集合合并为一个集合

时间:2018-05-22 16:07:31

标签: c# linq

我将多个集合合并为一个有问题 - >我需要将来自许多传感器的数据连接成一个集合,以便每次都有输出文件中所有传感器的值,即f.e。如果一个传感器没有数据,它将用0填充文件 请帮助我,我绝望了

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

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

2 个答案:

答案 0 :(得分:0)

假设您有加入的内容,可以使用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,但是他们可以访问任何内容。该链接可能更有帮助,但您没有给我们太多信息

答案 1 :(得分:0)

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

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

public static DateTime Round(this DateTime dt, TimeSpan rnd) {
    if (rnd == TimeSpan.Zero)
        return dt;
    else {
        var ansTicks = 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手动执行此操作。