如何使用LINQ将对象列表转为键为属性名的Dictionary<string, List<string>>
使用LINQ将Personne对象列表转换为指定字典类型
给定如下personne类:
public class personne { public string code {get; set;} public string ItemName {get;set;} public string Adresse {get;set;} }
我们需要将该类的对象列表转换为Dictionary<string, List<string>>类型的字典,其中字典的键为类的属性名,值为对应属性的所有值组成的字符串列表。
方法一:硬编码实现(性能优先)
如果类的属性固定,直接针对每个属性编写LINQ查询是最直观且高效的方式:
// 示例personne对象列表 List<personne> personneList = new List<personne> { new personne { code = "001", ItemName = "张三", Adresse = "北京" }, new personne { code = "002", ItemName = "李四", Adresse = "上海" } }; var resultDict = new Dictionary<string, List<string>> { { nameof(personne.code), personneList.Select(p => p.code).ToList() }, { nameof(personne.ItemName), personneList.Select(p => p.ItemName).ToList() }, { nameof(personne.Adresse), personneList.Select(p => p.Adresse).ToList() } };
方法二:反射+LINQ实现(扩展性优先)
如果需要支持属性动态变化的场景,可以通过反射结合LINQ自动生成字典:
using System.Reflection; // 示例personne对象列表 List<personne> personneList = new List<personne> { new personne { code = "001", ItemName = "张三", Adresse = "北京" }, new personne { code = "002", ItemName = "李四", Adresse = "上海" } }; var resultDict = typeof(personne) .GetProperties(BindingFlags.Public | BindingFlags.Instance) // 仅筛选string类型属性,避免非字符串属性转换出错 .Where(prop => prop.PropertyType == typeof(string)) .ToDictionary( prop => prop.Name, prop => personneList.Select(p => (string)prop.GetValue(p)).ToList() );
两种方式的区别:
- 硬编码方式代码清晰、执行效率更高,适合属性固定不变的场景。
- 反射方式无需手动维护每个属性的转换逻辑,当类的属性新增或修改时代码无需调整,但性能略低于硬编码方式。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

