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());