【问题标题】:Convert a Model Class Collection to Dictionary based on property as KEY using LINQ C#使用 LINQ C# 将模型类集合转换为基于属性作为 KEY 的字典
【发布时间】:2016-03-29 05:39:13
【问题描述】:

我有一个 Person List<Person> 的集合,现在我需要创建一个字典,键应该是属性名称值是该受尊重属性的不同值List<Object>

字典应该像Dictionary<string, List<object>>

C#源代码:

void Main()
{
    List<Person> EmpList = new List<Person>()
    {
        new Person() {ID = 101, Name = "Peter", Gender = "Male", Role = "Manager"},
        new Person() {ID = 102, Name = "Emma Watson", Gender = "Female", Role = "Assistant"},
        new Person() {ID = 103, Name = "Kaliya", Gender = "Manager", Role = "Assistant"},
    };
}

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

我的期望是

Dictionary<string, List<object>> EmpDictionary = new Dictionary<string, List<object>>();
EmpDictionary.Add("ID", new List<object>() { 101, 102, 103 });
EmpDictionary.Add("Name", new List<object>() { "Peter", "Emma Watson", "Kaliya" });
EmpDictionary.Add("Gender", new List<object>() { "Male", "Female" });
EmpDictionary.Add("Role", new List<object>() { "Manager", "Assistant" });

我希望使用 LINQ C# 像这样构造一个字典

注意:将解决方案作为全局解决方案。应该有 n 个 属性

【问题讨论】:

    标签: c# linq list dictionary model


    【解决方案1】:

    你可以使用:

    var d = typeof(Person).GetProperties()
                          .Select(p => new
                          {
                              Key = p.Name,
                              Value = EmpList.Select(epm => p.GetValue(epm)).ToList()
                          })
                          .ToDictionary(x => x.Key, x => x.Value);
    

    【讨论】:

    • 非常感谢...如果 List 是 Item Source,那么我们不知道集合的 typeof。那么如何实现呢?请帮助我...
    • 这篇文章可能对您有所帮助:How to find the member type of a list?
    • 为什么要通过匿名类型传递名称和值?为什么不直接将它们传递给ToDictionary 并避免合成它们?
    【解决方案2】:

    这不是性能最高的选项(您已经掌握了),但它会起作用。

    var ret = typeof(Person)
        .GetProperties()
        .ToDictionary(c => c.Name, c => EmpList.Select(x => c.GetValue(x)).ToList());
    

    诚然,我有点想重新考虑你在做什么。除非您特别尝试同时使用反射和 LINQ(在这种情况下,请继续努力!),我不确定这对于大多数情况来说是否是一个好的设计。值得深思。

    【讨论】:

      【解决方案3】:

      为什么不直接创建一个

      var dictionary = new Dictionary<string, Person>();
      
      dictionary.Add("101", new Person{ Id = 101, Name = "Peter" ... etc...}
      

      你可以更容易地找到这本字典:

      Console.WriteLine("Name: " + dictionary["101"].Name);
      

      【讨论】:

      • 我可以使用 EmpList.ToDictionary(x => x.ID);但是我的要求不一样。请再次阅读该帖子...
      • 你应该重新考虑你的代码。制作对您和其他同事有意义的物品。与其试图在代码中“聪明”,不如避免做“不那么聪明”的事情,比如降低代码的可读性。如果你有一组人物对象,就这样对待它,而不是一组奇怪的属性,你会花 15 分钟了解你在 3 个月后做了什么。
      • 我正在创建一个自定义数据网格,为此我需要按列区分不同值进行过滤操作。所以,我需要那样...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2010-10-07
      • 2011-03-03
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      相关资源
      最近更新 更多