linq C#中基于公共属性的多列数据表转换

uajslkp6  于 2023-04-27  发布在  C#
关注(0)|答案(1)|浏览(156)

我有多个带有时间戳的信号数据列表。例如SignalA包含{time,value}对象的列表。同样,SignalB包含{time,value}对象的列表。我可以有任何数量的这样的列表,它不是固定的。可以有2,3,4或任何...

SignalA = [{time="10:00", value=1},{time="11:00", value=2}, {time="12:00", value=3}]
SignalB = [{time="10:00", value=2},{time="11:00", value=3}, {time="12:00", value=1}]
SignalC = [{time="10:00", value=3},{time="11:00", value=1}, {time="12:00", value=2}]

现在我想创建一个数据表,其中包含时间,信号B,信号A列。信号A列包含信号A对象的值属性,同样,信号B列包含信号B对象在特定时间的值属性。

Datatable = [{time="10:00", SignalA=1, SignalB=2, SignalC=3}, {time="11:00", SignalA=2, SignalB=3, SignalC=1}, {time="12:00", SignalA=3, SignalB=1, SignalC=2}]
czq61nw1

czq61nw11#

如果你的列表SignalASignalB是排序的,并且都有相同的time值,这可以很容易地用Linq.Zip解决:

using System;
using System.Collections.Generic;
using System.Linq;

class Test {
  static void Main() {
    var SignalA = new[] { new {time="10:00", value=1}, new {time="11:00", value=2}, new {time="12:00", value=3} };
    var SignalB = new[] { new {time="10:00", value=2}, new {time="11:00", value=3}, new {time="12:00", value=1} };
    var Datatable = SignalA.Zip(SignalB, (a, b) => new {time=a.time, SignalA=a.value, SignalB=b.value});
    
    foreach (var entry in Datatable) {
        Console.WriteLine(entry);
    }
  }
}

输出:

{ time = 10:00, SignalA = 1, SignalB = 2 }
{ time = 11:00, SignalA = 2, SignalB = 3 }
{ time = 12:00, SignalA = 3, SignalB = 1 }

相关问题