类型列表 T 到字典

本文关键字:字典 列表 类型 | 更新日期: 2023-09-27 17:56:47

我有一个对象List<T>和一个键字段名称类型T我正在尝试将此List<T>转换为Dictionary<string,double>

例如,如果类型 T 是 Person 类型,我将得到keyfieldName ="UserId"

ListItem1==>    Person
        UserId  1
        Firstname : "John"
        Lastname    "Doe"
ListItem2==>    Person
        UserId  2
        Firstname : "Mark"
        Lastname    "Twain"
ListItem3==>    Person
        UserId  27
        Firstname : "Hello"
        Lastname    "Life"      

我期望的结果将是Dictionary<string,double>,想法是获取类型中的每个属性 T 获取其值并附加 :keyfieldName。 键字段名称本身从字典中排除。类型 T 中的所有属性都必须转换为字符串。

字典应如下所示:

"John:1",0
"Doe:1",0
"Mark:2",0
"Twain:2",0
"Hello:27",0
"Life:27",0 

到目前为止,我尝试的是循环:

FieldInfo Idfield = typeof(T).GetField(HashKeyFieldName);
foreach (var item in indexItems)
{
    string keyvalue = Idfield.GetValue(item).ToString();
    foreach (var f in typeof(T).GetFields().Where(f => f.Name != HashKeyFieldName))
    {
        string obj =f.GetValue(item).ToString() + ":" + keyvalue;
    }
}

我注意到List具有ToDictionary功能;我想知道它是否可以做得更快更好,如果是这样,如何完成?

类型列表 T 到字典

如果你事先知道类型,我只会使用:

var dictionary = list.Select(x => x.FirstName + ":" + x.UserId)
                     .Concat(list.Select(x => x.LastName + ":" + x.UserId))
                     .ToDictionary(p => p, p => 0);

每个额外的属性都会有一个额外的Concat调用,但这应该不会太糟糕 - 同样,如果您提前知道该类。 如果你真的需要用反射来做到这一点,那么你已经拥有的代码大致是我会使用的 - 尽管我强烈建议你使用属性而不是字段。