С# Перечисление с условием

Вопрос:

Я наткнулся на сценарий, в котором мне нужно сгруппировать команду по нескольким наборам столбцов. Я смог его решить, но потом возникла проблема. Строки должны были быть сгруппированы только в том случае, если ключ группировки удовлетворяет условию.

Я применил образец сценария для отображения ролей сотрудников для различных проектов.

public class EmployeeRoleDept
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public int DeptartmentId { get; set; }
public string DeptartmentName { get; set; }
public int ProjectId { get; set; }
public string ProjectName { get; set; }
}

var listEmployee = new List<EmployeeRoleDept>
{
new EmployeeRoleDept{ RoleId = 1 ,RoleName="CEO",DeptartmentId = 1 , DeptartmentName = string.Empty, ProjectId = 1,ProjectName=string.Empty},
new EmployeeRoleDept{ RoleId = 2, RoleName="PM", DeptartmentId = 2, DeptartmentName = "Dept A", ProjectId = 2,ProjectName="Project 2"},
new EmployeeRoleDept{ RoleId = 2, RoleName="PM", DeptartmentId = 2 ,DeptartmentName = "Dept A", ProjectId = 3,ProjectName="Project 3"},
new EmployeeRoleDept{ RoleId = 2, RoleName="PM", DeptartmentId = 3, DeptartmentName = "Dept B", ProjectId = 4,ProjectName="Project 4"},
new EmployeeRoleDept{ RoleId = 2, RoleName="PM", DeptartmentId = 3 ,DeptartmentName = "Dept B", ProjectId = 5,ProjectName="Project 5"},
new EmployeeRoleDept{ RoleId = 3, RoleName="Dev",DeptartmentId = 4 ,DeptartmentName = "Dept C", ProjectId = 6,ProjectName="Project 6"},
new EmployeeRoleDept{ RoleId = 3, RoleName="Dev",DeptartmentId = 4 ,DeptartmentName = "Dept C", ProjectId = 7,ProjectName="Project 7"},
new EmployeeRoleDept{ RoleId = 3, RoleName="Dev",DeptartmentId = 5 ,DeptartmentName = "Dept D", ProjectId = 8,ProjectName="Project 8"},
new EmployeeRoleDept{ RoleId = 4, RoleName="Tester",DeptartmentId = 4,DeptartmentName = "Dept C" , ProjectId = 6,ProjectName="Project 6"},
new EmployeeRoleDept{ RoleId = 4, RoleName="Tester",DeptartmentId = 6,DeptartmentName = "Dept E" , ProjectId = 9,ProjectName="Project 9"},
};

И сетка, которая должна быть получена, должна быть чем-то вроде этого

         |  RoleName | Dept Name |   Project  |
----------------------------------------------
|  CEO      |           |            |
|  PM       | Dept A    |            |
|  PM       | Dept B    |            |
|  Dev      | Dept C    | Project 6  |
|  Dev      | Dept C    | Project 7  |
|  Dev      | Dept D    | Project 8  |
|  Tester   | Dept C    | Project 6  |
|  Tester   | Dept E    | Project 9  |

Если Сотрудник является Менеджером проекта (PM) Департамента, он будет премьер-министром всех проектов в рамках Департамента. Поэтому имя проекта не обязательно должно отображаться в гриде. Поэтому я предполагаю, что мы должны сгруппировать его по адресу RoleId, если только он PM.

Я попытался сгруппировать их с RoleId так же, как 2

var grouplist = listEmployee.GroupBy(x => x.RoleId==2).ToList();

Но я просто получаю группу с только ролью PM и остальными ролями во второй группе.

Лучший ответ:

Метод GroupBy принимает функцию, которая возвращает значение для группировки. Поскольку вы возвращаете логическое выражение, вы группируете данные в две группы: true (RoleId == 2) и false (все остальные).

Здесь вам может не понадобиться группа. Это должно дать вам данные, которые вы ищете…

var summarizedList = listEmployee
                         .Select(e => new {
                                RoleName = e.RoleName,
                                DeptName = e.DeptartmentName,
                                Project = (e.RoleId == 2 ? string.Empty : e.ProjectName)
                         })
                         .Distinct()
                         .ToList();

Оцените статью
TechArks.Ru
Добавить комментарий