C# 使用LINQ C将基于属性作为键的模型类集合转换为字典#

C# 使用LINQ C将基于属性作为键的模型类集合转换为字典#,c#,linq,list,dictionary,model,C#,Linq,List,Dictionary,Model,我正在收集Person列表,现在我需要创建一个字典,键应该是属性名,值是受尊重属性的不同值,即列表 字典应该类似于字典 C#源代码: void Main() { List<Person> EmpList = new List<Person>() { new Person() {ID = 101, Name = "Peter", Gender = "Male", Role = "Manager"}, new Person()

我正在收集Person
列表
,现在我需要创建一个字典,键应该是属性名值是受尊重属性的不同值,即
列表

字典应该类似于
字典

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; }
}
void Main()
{
List EmpList=新列表()
{
新人(){ID=101,Name=“Peter”,Gender=“Male”,Role=“Manager”},
新人(){ID=102,Name=“Emma Watson”,Gender=“Female”,Role=“Assistant”},
新人(){ID=103,Name=“Kaliya”,Gender=“Manager”,Role=“Assistant”},
};
}
公共阶层人士
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串{get;set;}
公共字符串角色{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" });
Dictionary=newdictionary();
Add(“ID”,new List(){101、102、103});
添加(“名称”,新列表(){“彼得”,“艾玛·沃森”,“卡莉娅”});
添加(“性别”,新列表(){“男性”,“女性”});
添加(“角色”,新列表(){“经理”,“助手”});
我希望使用LINQ C构建一个这样的字典#

注:以全局形式给出解决方案。应该有一个n个 性质

为什么不创建一个

var dictionary = new Dictionary<string, Person>();

dictionary.Add("101", new Person{ Id = 101, Name = "Peter" ... etc...}

这不是性能最好的选项(你已经有了),但它会起作用

var ret = typeof(Person)
    .GetProperties()
    .ToDictionary(c => c.Name, c => EmpList.Select(x => c.GetValue(x)).ToList());
诚然,我有点想重新考虑你在做什么。除非您特别尝试将反射和LINQ一起使用(在这种情况下,请继续使用!),否则我不确定这在大多数情况下是否是一个好的设计。仅供思考。

您可以使用:

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);

我可以使用EmpList.ToDictionary(x=>x.ID)实现这一点;但我的要求不同。请再次阅读这篇文章…你应该重新思考你的代码。制作对您和其他同事有意义的对象。不要试图在代码中“聪明”,你应该避免做“不那么聪明”的事情,比如降低代码的可读性。如果你有一组person对象,就这样对待它,而不是像一组奇怪的属性那样,花15分钟的时间来理解3个月后你做了什么。我正在创建一个自定义DataGrid,为此我需要用于筛选操作的按列不同值。所以,我需要像那样…非常感谢。。。如果列表是项源,那么我们不知道集合的类型。那么如何做到这一点呢?请帮助我…你可能会发现这篇文章很有帮助:为什么你要通过匿名类型传递名称和值?为什么不直接将它们传递给
ToDictionary
并避免合成它们呢?
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);