C# 使用LINQ C将基于属性作为键的模型类集合转换为字典#
我正在收集PersonC# 使用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()
列表
,现在我需要创建一个字典,键应该是属性名,值是受尊重属性的不同值,即列表
字典应该类似于字典
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);