C# 使用linq对列表列表进行分组

C# 使用linq对列表列表进行分组,c#,linq,C#,Linq,我有这些桌子 public class TaskDetails { public string EmployeeName {get; set;} public decimal EmployeeHours {get; set;} } public class Tasks { public string TaskName {get; set;} public List<TaskDetails> TaskList {get; set;} } 我有一个返回列

我有这些桌子

public class TaskDetails
{
    public string EmployeeName {get; set;}
    public decimal EmployeeHours {get; set;}
}
public class Tasks
{
    public string TaskName {get; set;}
    public List<TaskDetails> TaskList {get; set;}
}
我有一个返回列表的函数。我需要的是创建一个新列表,对EmployeeNames进行分组,并将EmployeeHours相加,而不考虑TaskName。也就是说,我需要获取每个员工的总工时。怎么弄到的

附言:到目前为止我做了些什么。我已经盯着代码看了很久了。试图用橡皮鸭来解决问题,但没有用。我可以使用foreach并将其放入字典中获得结果。该逻辑将检查键是否不存在,添加一个新键并分配值,如果键存在,则将十进制值添加到原始值。但我觉得这里太多了。我觉得有一个ForEach-GroupBy-Sum的组合,我缺少了

任何关于如何做的建议都会对我很有帮助。

我想,很多人都会有帮助

它会将所有任务元素的TaskDetail列表展平为一个IEnumerable

给你一本字典

要获取列表,只需将ToDictionary替换为Select/ToList链:

此外,如果类名和字段名都是Tasks,则会出现编译时错误:

Error   1   'Tasks': member names cannot be the same as their enclosing type

我会给你的类任务命名,因为它代表单个任务。

我会这样做:

var query =
(
    from t in tasks
    from td in t.TaskList
    group td.EmployeeHours by td.EmployeeName into ghs
    select new
    {
        EmployeeName = ghs.Key,
        EmployeeHours = ghs.Sum(),
    }
).ToDictionary(x => x.EmployeeName, x => x.EmployeeHours);
我想更简洁一点的问题是:

var query =
(
    from t in tasks
    from td in t.TaskList
    group td.EmployeeHours by td.EmployeeName
).ToDictionary(x => x.Key, x => x.Sum());

每种方法都有利弊。我认为第一个更明确,但第二个更整洁。

您的代码无法编译。我收到错误“Tasks”:成员名称不能与其封闭类型相同。Tasks类上不能有Tasks属性。抱歉,我在抽象问题时忽略了输入错误。更正。对不起,我是在抽象问题,忽略了打字错误。更正。
var emplWithHours = allTasks
    .SelectMany(t => t.Tasks)
    .GroupBy(empl => empl.EmployeeName)
    .Select(empl => new
    {
        EmployeeName = empl.Key,
        TotalHours = empl.Sum(hour => hour.EmployeeHours)
    }).ToDictionary(i => i.EmployeeName, i => i.TotalHours);
Error   1   'Tasks': member names cannot be the same as their enclosing type
var query =
(
    from t in tasks
    from td in t.TaskList
    group td.EmployeeHours by td.EmployeeName into ghs
    select new
    {
        EmployeeName = ghs.Key,
        EmployeeHours = ghs.Sum(),
    }
).ToDictionary(x => x.EmployeeName, x => x.EmployeeHours);
var query =
(
    from t in tasks
    from td in t.TaskList
    group td.EmployeeHours by td.EmployeeName
).ToDictionary(x => x.Key, x => x.Sum());