C# 是否有更好的LINQ查询来实现这一点?

C# 是否有更好的LINQ查询来实现这一点?,c#,linq,C#,Linq,假设我有一个简单的对象列表,每个对象都有一个人的名字和他们所扮演的角色,如下所示: var People = new[] { new PersonRole(){ Name = "Adam", Role = "R1" }, new PersonRole(){ Name = "Adam", Role = "R2" }, new PersonRole(){ Name = "Adam", Role = "R3" }

假设我有一个简单的对象列表,每个对象都有一个人的名字和他们所扮演的角色,如下所示:

        var People = new[] { 
            new PersonRole(){ Name = "Adam", Role = "R1" },
            new PersonRole(){ Name = "Adam", Role = "R2" },
            new PersonRole(){ Name = "Adam", Role = "R3" },
            new PersonRole(){ Name = "Bob", Role = "R1" },
        };
现在,有没有一种直接的方法可以根据名称和角色(显然)将其输入到
词典中。我分两步来做,如下所示,但我认为还有更直接的方法

Dictionary<string, List<string>> resultLookup = 
   People.Select(p => p.Name).Distinct().ToDictionary(str => str, str => new List<string>());

People.ForEach(p => resultLookup[p.Name].Add(p.Role));
字典结果lookup=
People.Select(p=>p.Name).Distinct().ToDictionary(str=>str,str=>newlist());
People.ForEach(p=>resultLookup[p.Name].Add(p.Role));
谢谢

Dictionary Dictionary=people.GroupBy(p=>p.Name).ToDictionary(g=>g.Key,g=>g.Select(p=>p.Role).ToList());
Dictionary<string, List<string>> dictionary = people.GroupBy(p => p.Name).ToDictionary(g => g.Key, g => g.Select(p => p.Role).ToList());
未经测试,但我认为应该有效

编辑现在就对它进行了测试,事实上确实有效。

这应该可以做到:

var people = new[] { 
    new { Name = "Adam", Role = "R1" },
    new { Name = "Adam", Role = "R2" },
    new { Name = "Adam", Role = "R3" },
    new { Name = "Bob", Role = "R1" },
};

var r = from p in people
        group p by p.Name
        into g
        select new {
            Name = g.Key,
            Roles = g.Select(p => p.Role).ToList()
        };

var d = r.ToDictionary(k => k.Name, e => e.Roles);

您选择使用字典是因为一个人可以扮演多个角色吗?我认为只使用字典会更好。是的,一个人可以有多个rolesGroupBy——这是我想不出来的——真是太尴尬了,但是谢谢you@Adam:不客气。不知道你为什么觉得这很尴尬。这就是为什么要问你不确定的问题。你忘记了
ToList
调用,OP指定他想要一个
列表
,其中包含角色。+1因为没有将查询样式linq包装在括号中使用
。ToDictionary
。当你把这些部分分到另一行/作业上时,就更清楚了。哦,天哪,那太好了,我只是想我忘了GroupBy。
 var result = People.GroupBy(a => a.Name).ToDictionary(a => a.First().Name, b => b.Select(c => c.Role).ToList());
People
.GroupBy( p => p.Name )
.ToDictionary( p => p.Key, p => p.Select(pr => pr.Role).ToList() )
var dict = People.ToLookup(p=>p.Name, p=>p.Role)
  .ToDictionary(it=>it.Key, it=>it.ToList());