我有一个对象List<T>
和一个类型T
的keyfieldName我正在尝试将此List<T>
转换为Dictionary<string,double>
例如,如果Type 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附加它。 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
个功能;我想知道它是否可以更快更好地完成,如果是这样,怎么办?
答案 0 :(得分:1)
如果您事先知道类型,我只会使用:
var dictionary = list.Select(x => x.FirstName + ":" + x.UserId)
.Concat(list.Select(x => x.LastName + ":" + x.UserId))
.ToDictionary(p => p, p => 0);
每个附加属性会有一个额外的Concat
来电,但这不应该太糟糕 - 再次,如果你提前知道了这个课程。如果你真的需要用反射做这个,那么你已经得到的代码大致就是我使用的代码 - 尽管我强烈建议你使用属性而不是字段。