我正在尝试将1000s动态列表(我从CsvHelper读取csv文件)转换为静态类型,但它将永远占用。
这是代码:
动态对象
MyObj {
id =1, prop1=1,prop2=2,prop3=3...
}
结果
PObj1 { oid = 1 , name = "Property 1", value = "1" }
PObj2 { oid = 1 , name = "Property 2", value = "2" }
PObj3 { oid = 1 , name = "Property 3", value = "3" }
要转换的代码
var imp = rows.SelectMany(x => map.Keys.ToList().Select(k => new PObj
{
OID = (((IDictionary<string, object>)x)["oid"] ?? "").ToString(),
Name = k,
Value = ToDate((((IDictionary<string, object>)x)[map[k]] ?? "").ToString())
}).ToList()).ToList();
地图包含大约40-50的属性列表
map<string,string>{
{"Property 1","prop1"},
{"Property 1","prop2"},
{"Property 1","prop3"}
...
}
ToDate功能
private DateTime? ToDate(string strDate)
{
strDate = strDate.Split(' ')[0];
strDate = strDate.Replace('-', '/').Replace('.', '/');
DateTime? dt = null;
try
{
dt = DateTime.ParseExact(strDate, dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None);
} catch { }
return dt;
}
map可以包含任意数量的peroperties,因此expandoObject将具有动态数量的属性。
有什么方法可以提高性能吗?
我需要进行此转换的原因是因为我需要将此作为表发送到存储过程,因此如果对象中的数字属性发生更改,则将expandoObject直接转换为表会产生问题,因为此平均列数也将在表中更改。
如果在上述情况下工作,我也愿意接受其他解决方案。
答案 0 :(得分:0)
好像是我的电脑(在Mac上运行Windows)。相同的代码现在可以正常工作
rows.ToList().ForEach(x => imps.AddRange(map.Keys.Select(k => new ImportMilestone
{
JVSiteID = (((IDictionary<string, object>)x)[siteid] ?? "").ToString(),
Milestone = k,
MilestoneValue = ToDate((((IDictionary<string, object>)x)[map[k]] ?? "").ToString())
}).ToList()));