我有一个高级程序,它从数据库中检索数据,并通过C#中的ExpandoObjects从数据创建对象。优化字典在C#中添加ExpandoObjects
我现在正在优化我的整个过程,但遇到了一段代码,这是性能方面的瓶颈。我很好奇我到底能furhter优化这段代码,并已经成功地以最快的速度通过执行以下操作运行3次:在一个单独的
- 分隔“的发现‘类型’一节”循环并且只在它尚未初始化时才迭代它。
添加了一个案例,当值为null并且创建一个空字符串时,由于某些原因,Dictionary.Add在添加Null值时变慢了很多。
// Holds all objects that are created inside the object. Dictionary<string, IDictionary<string, dynamic>> objects = new Dictionary<string, IDictionary<string, dynamic>>(); // This foreach loop is the slowest part! foreach (KeyValuePair<string, dynamic> pair in fields) { string type = pair.Key.Split('_')[0]; IDictionary<string, dynamic> obj; if (!objects.TryGetValue(type, out obj)) { obj = new ExpandoObject(); objects.Add(type, obj); } int location = pair.Key.IndexOf(type + "_"); string key = pair.Key.Remove(location, type.Length + 1); if (pair.Value == null) // If Value is null, replace it with an empty string (dictionary slows quite alot when passing it null values) obj.Add(key, ""); else obj.Add(key, pair.Value); } if (types == null) types = objects.Select(x => x.Key).ToList();
我想知道,它是如何将Null值时词典减慢这么多,难道是在底层结构就遇到空值时做特殊操作?还有什么我失踪,进一步优化代码?
任何帮助,再次非常感谢。
UPDATE
- 编辑的代码与最近的更改我已经从SO聚集。
请注意,您的编辑没有得到我提出的所有更改。你错过了循环结尾的重要部分:'obj.Add'而不是'objects [type] .Add' –
@DanielHilgarth,你是对的!我一定错过了,对不起:)。我再次编辑了这篇文章。 –