使用LINQ将List <object>更改为List <list <int >>

时间:2018-07-24 21:21:02

标签: arrays json list linq chart.js

我有一个使用以下模型的应用程序:

namespace myapp.Models.Types
{
        public class PressureRowT
        {
            public System.DateTime Timestamp { get; set; }
            public int P1{ get; set; }
            public int P2{ get; set; }
            public int P3{ get; set; }
            public int P4{ get; set; }
            public int P5{ get; set; }
        }
}

我有一个List ,其中包含大约5000个元素,这些元素是通过解析文件生成的。我需要通过将数据传递到chart.js进行数据绘制来绘制压力。为此,我需要一个JSON数组,例如:

[Timestamp: [date1, date2, date3... daten], P1: [val1, val2, val3, ..., valn], P2: [val1, val2, val3, ..., valn] ... P5: [val1, val2, val3, ..., valn]]

“反转”结构的最有效方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:0)

假设现在您有一个PressureRowT列表,并且想要一个对象内部包含列表的PressureRowT,则可以使用

var Timestamps = pressureRowTList.Select(pressureRowT => pressureRowT.TimeStamp).ToList();

将每个字段都分配给一个对象。

答案 1 :(得分:0)

最有效的方法是重新编写解析代码,以在读取文件时构建正确的结构。

除非如此,否则最好不要使用LINQ,而只需构建所需的List。处理for时,foreach循环比List更有效:

var src = new List<PressureRowT>();

var srccount = src.Count;
var PR_TS = new List<DateTime>(srccount);
var PR_P1 = new List<int>(srccount);
var PR_P2 = new List<int>(srccount);
var PR_P3 = new List<int>(srccount);
var PR_P4 = new List<int>(srccount);
var PR_P5 = new List<int>(srccount);

for (int j1 = 0; j1 < srccount; ++j1) {
    PR_TS.Add(src[j1].Timestamp);
    PR_P1.Add(src[j1].P1);
    PR_P2.Add(src[j1].P2);
    PR_P3.Add(src[j1].P3);
    PR_P4.Add(src[j1].P4);
    PR_P5.Add(src[j1].P5);
}

var ans = new { Timestamp = PR_TS, P1 = PR_P1, P2 = PR_P2, P3 = PR_P3, P4 = PR_P4, P5 = PR_P5 };

答案 2 :(得分:0)

我可能使用Aggregate来建立结果对象:

IEnumerable<PressureRowT> values;
var resultSeed = new {
    Timestamp = new List<DateTime>(),
    P1 = new List<int>(),
    P2 = new List<int>(),
    P3 = new List<int>(),
    P4 = new List<int>(),
    P5 = new List<int>(),
};

return values.Aggregate(
    resultSeed,
    (result, value) => {
        result.Timestamp.Add(value.Timestamp);
        result.P1.Add(value.P1);
        result.P2.Add(value.P2);
        result.P3.Add(value.P3);
        result.P4.Add(value.P4);
        result.P5.Add(value.P5);
        return result;
    });