【问题标题】:Construct KeyValuePair<int, string> with distinct Key and Concat Values if duplicate exist in the Key from a List如果 List 中的 Key 中存在重复项,则使用不同的 Key 和 Concat 值构造 KeyValuePair<int, string>
【发布时间】:2016-03-18 16:40:15
【问题描述】:

如果列表中的键中存在重复项,如何构造具有不同键和连接值的列表?

Class Boss 有一个子 Class Collection Person,用于代表他/她下的员工列表。

创建一个列表> 具有不同的键 (EmpID) 和值(角色 - 它可能包含多个值)使用单个内联 LINQ 语句。

void Main()
{

    List<Boss> BossList = new List<Boss>()
    {
        new Boss()
        {
            EmpID = 101,
            Name = "Harry",
            Department = "Development",
            Gender = "Male",
            Role = "Manager",
            Employees = new List<Person>()
            {
                new Person() {EmpID = 102, Name = "Peter", Department = "Development",Gender = "Male", Role = "Assistant"},
                new Person() {EmpID = 103, Name = "Emma Watson", Department = "Development",Gender = "Female", Role = "Assistant"},

            }
        },
        new Boss()
        {
            EmpID = 104,
            Name = "Raj",
            Department = "Development",
            Gender = "Male",
            Role = "Manager",
            Employees = new List<Person>()
                    {
                        new Person() {EmpID = 105, Name = "Kaliya", Department = "Development",Gender = "Male", Role = "Assistant"},
                        new Person() {EmpID = 103, Name = "Emma Watson", Department = "Development",Gender = "Female", Role = "Assistant"},

                    }
        },
        new Boss()
        {
            EmpID = 102,
            Name = "Peter",
            Department = "Development",
            Gender = "Male",
            Role = "Manager",
            Employees = new List<Person>()
                    {
                        new Person() {EmpID = 105, Name = "Kaliya", Department = "Development",Gender = "Male", Role = "Assistant"},
                        new Person() {EmpID = 103, Name = "Raj", Department = "Development",Gender = "Male", Role = "Assistant"},

                    }
        }
    };

    List<KeyValuePair<int, string>> EmployeeList = new List<KeyValuePair<int, string>>();

}

public class Person
{
    public int EmpID { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
    public string Gender { get; set; }
    public string Role { get; set; }
}

public class Boss
{
    public int EmpID { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
    public string Gender { get; set; }
    public string Role { get; set; }
    public List<Person> Employees { get; set; }
}

我的预期输出应该是

List<KeyValuePair<int, string>> EmployeeList = new List<KeyValuePair<int, string>>()
    {
        {new KeyValuePair<int, string>(101, "Manager")},
        {new KeyValuePair<int, string>(102, "Assistant, Manager")}
        {new KeyValuePair<int, string>(103, "Assistant")}
        {new KeyValuePair<int, string>(104, "Manager, Assistant")}
        {new KeyValuePair<int, string>(105, "Assistant")}
    }

说明: 这里 EmpID 101 有一个 Role Manager,但 EmpID 102 是 EmpID 101 的 Assistant 和 Manager。因此 EmpID 102 具有双重角色助理和经理。使用逗号分隔符连接角色。请帮助我...

如何从List&lt;Boss&gt;BossList实现List Members

注意:使用单行内联 LINQ 语句给出答案。

在真实场景中,我有一个复杂的 Linq 语句,因为这是一个小要求。因此,我无法拆分为多个语句。所以,我需要在一个内联中解决这个问题。如果多个语句实现意味着,我有一个解决方案。请帮助我...

【问题讨论】:

  • “使用单行内联 LINQ 语句给出答案”。为什么要人为限制?这是作业吗?
  • @JLRishe 这不是家庭作业。我有一个复杂的 Linq 语句,因为这是一个小要求。因此,我无法拆分为多个语句。所以,我需要在内联中解决这个问题。如果多个语句实现意味着,我有一个解决方案。请帮助我...
  • 我认为 linq 不适合这里。它变得更难理解,你可能会在一段时间后忘记它。这就是我所经历的......

标签: c# linq list keyvaluepair


【解决方案1】:

这个这个:

var result = BossList.SelectMany (boss => boss.Employees).
    Select (employe => new { EmpID = employe.EmpID, Role = employe.Role }).
    Concat (BossList.Select (boss => new { EmpID = boss.EmpID, Role = boss.Role })).
    GroupBy (person => person.EmpID,
        (key, values) => new KeyValuePair<int, string> (key,
            string.Join (", ", values.Select (person => person.Role).Distinct ()))).
    OrderBy (person => person.Key). // If key order matters.
    ToList ();
}

NOTE 将只返回一个 ID 为 104 的项目,因为没有 ID 为 104 的助手。

【讨论】:

  • 你没有包括老板的员工
  • 它只返回值为“Manager”的 101、102、104
【解决方案2】:
BossList
    .SelectMany(boss => boss.Employees)
    .Select(emp => new {emp.EmpID, emp.Role})
    .Union(BossList.Select(boss => new {boss.EmpID, boss.Role}))
    .GroupBy(kv=>kv.EmpID)
    .Select(kv=>new {ID= kv.Key, Roles = String.Join(",", kv.Select(kkv=>kkv.Role))})
    .ToDictionary(kv => kv.ID, kv=>kv.Roles)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多