我将多个集合合并为一个有问题 - >我需要将来自许多传感器的数据连接成一个集合,以便每次都有输出文件中所有传感器的值,即f.e。如果一个传感器没有数据,它将用0填充文件 请帮助我,我绝望了
public class MeasuredData
{
public DateTime Time { get; }
public double Value { get; }
public MeasuredData(DateTime time, double value)
{
Time = time;
Value = value;
}
}
答案 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
手动执行此操作。