[英]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.