尝试使用linq来转移数据

Pet*_*gun 3 c# linq custom-lists

我有以下类结构:

 public class TaskLog
 {
    public DateTime LogDate { get; set; }
    public string Robot { get; set; }
    public string Task { get; set; }
    public Enums.ProbeDataState State { get; set; }

    public TaskLog()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个通用列表如下:

List<TaskLog> Logs;
Run Code Online (Sandbox Code Playgroud)

我的输出:

Robot   Date                    State
---------------------------------------------
aaa     8/5/2013 12:00:00 AM    Task:1=fileDeltaFailed
aaa     8/5/2013 12:00:00 AM    Task:2=fileDeltaFailed
aaa     8/5/2013 12:00:00 AM    Task:4=fileDeltaFailed
bbb     8/5/2013 12:00:00 AM    Task:1=fileDeltaFailed
bbb     8/5/2013 12:00:00 AM    Task:2=fileDeltaFailed
bbb     8/5/2013 12:00:00 AM    Task:4=fileDeltaFailed
Run Code Online (Sandbox Code Playgroud)

但是,我想将任务分组并说明如下:

                                Tasks
Robot   Date                    1                 2                4
aaa     8/5/2013 12:00:00 AM    fileDeltaFailed   fileDeltaFailed  fileDeltaFailed 
bbb     8/5/2013 12:00:00 AM    fileDeltaFailed   fileDeltaFailed  fileDeltaFailed
Run Code Online (Sandbox Code Playgroud)

我尝试使用groupby没有运气,而且非常困难.

例如

 var dataQuery = Logs.Where(w => w.LogDate >= start && w.LogDate <= finish).GroupBy(g => g.LogDate).Select(t => new
            {
                LogDate = t.Key,
                Details = t.OrderBy(o => o.Robot)
            }).ToList();
Run Code Online (Sandbox Code Playgroud)

nmc*_*ean 5

如果我理解了这个问题,你需要为每个机器人映射任务到状态.您可以按机器人分组并为每个组选择一个字典:

Logs.GroupBy(t => t.Robot).Select(g => new {
    Robot = g.Key,
    TaskStates = g.ToDictionary(t => t.Task, t => t.State)
})
Run Code Online (Sandbox Code Playgroud)

这假设任务名称对于每个机器人都是唯一的(ToDictionary否则会抛出异常).

您还可以为日期添加另一级别的分组:

Logs.GroupBy(t => t.LogDate).Select(g => new {
    Date = g.Key,
    Details = g.GroupBy(t => t.Robot).Select(g => new {
        Robot = g.Key,
        TaskStates = g.ToDictionary(t => t.Task, t => t.State)
    }).ToList()
})
Run Code Online (Sandbox Code Playgroud)

请注意,该Details属性基本上等同于我的第一个示例,唯一的区别是它查询外部分组而不是整个序列.结果是{Date,Details}的序列,其中每个"detail"是{Robot,TaskStates}的列表.

我没有测试过这个,所以如果我错过了任何错误,请告诉我.