【问题标题】:List object ToDictionary <object, List<object>>列出对象 ToDictionary <object, List<object>>
【发布时间】:2014-04-28 09:40:25
【问题描述】:
public class User
{
   public string name { get; set; }
   public string login { get; set; }     
   public string company { get; set; }
}

如何将List&lt;User&gt; 转换为ToDictionary&lt;string, List&lt;string&gt;&gt; 其中键:company 值:名称。

我尝试这样做

List<User> users = context.getallUsers();
var usersByCompany = users .ToDictionary<string, List<string>>(u => u.company, users.Where(d=>d.company==u.company).Select(c=>c.name).ToList()); 

【问题讨论】:

    标签: c# linq dictionary


    【解决方案1】:

    首先按公司分组用户,然后将组转换为字典:

    users.GroupBy(u => u.company)
         .ToDictionary(g => g.Key,
                       g => g.Select(u => u.name).ToList());
    

    注意:字典的类型将根据使用情况推断。

    您也可以考虑使用ILookup&lt;string, string&gt; 而不是Dictionary&lt;string, List&lt;string&gt;&gt;

    users.ToLookup(u => u.company, u => u.name)
    

    【讨论】:

    • 投反对票意味着这个答案没有用。 Downvoter,如果您能解释为什么它没有用或错误,我将非常感激?
    【解决方案2】:

    您可能想使用ToLookup 方法:

    ILookup<string, User> usersLookup = users.ToLookup(u => u.company);
    

    usersLookup 可以被company 索引

    foreach (User u in userLookup["IBM"]) {...} //IBM users
    

    如果您仍需要公司名称对,请尝试以下操作:

    ILookup<string, string> usersLookup = users.ToLookup(u => u.company, u => u.name);
    

    【讨论】:

    • OP 想要名称列表,而不是整个用户对象。另外我已经提到了查找选项
    • 您可能已经编辑了答案,在您的第一个版本中您没有提到该选项。
    • 现在您正在复制我的解决方案。有什么特别的原因吗?我的答案也比你早 7 分钟出现。所有的编辑都更早完成了。
    • Sergey,一旦我进入这个帖子,你的答案就没有ToLookup 选项,所以我添加了它。当我发布我的答案时,您可能已经编辑了您的答案。
    • 顺便说一句,不知道为什么你的回答被否决了,我没有那样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多