我有以下类结构:
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()
{
}
}
我创建了一个通用列表,如下所示:
List<TaskLog> Logs;
我的输出:
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
不过,我想将任务分组并说明如下:
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
我尝试使用 groupby 但没有成功,并且陷入困境。
e.g.
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();
如果我理解这个问题,您需要每个机器人的任务到状态的映射。您可以按机器人分组并为每个组选择一个字典:
Logs.GroupBy(t => t.Robot).Select(g => new {
Robot = g.Key,
TaskStates = g.ToDictionary(t => t.Task, t => t.State)
})
这假设每个机器人的任务名称都是唯一的(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()
})
请注意,Details
属性本质上等同于我的第一个示例,唯一的区别是它查询外部分组而不是整个序列。结果是 {Date, Details} 序列,其中每个“详细信息”都是 {Robot, TaskStates} 的列表。
我还没有测试过这个,所以如果有我错过的错误,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)