我有对象列表的优化问题。这些对象还包含其他对象的列表。我需要多次执行代码:
var result = objectsList.Where(d=>d.subObject.Where(w=>w.name == "WhatIamLookingFor").Count() > 0).FirstOrDefault();
此代码工作正常,但执行速度非常慢。如何提高绩效?
目前搜索执行约30秒。
答案 0 :(得分:0)
至少你应该替换它:
d=>d.subObject.Where(w=>w.name == "WhatIamLookingFor").Count() > 0
用这个:
d=>d.subObject.Any(w=>w.name == "WhatIamLookingFor")
因为您的代码会搜索所有次出现的子对象,其名称等于" WhatIamLookingFor"。找到第一个匹配项时返回Any
(即,count为> 0)。
P.S。我建议您使用List<T>
/ Collection<T>
(或其后代)。
答案 1 :(得分:0)
向objectsList的每个对象添加HashSet<string>
(请参阅http://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx)。此哈希集将包含subObject的name属性。
然后将查询更改为此
var result = objectsList.Where(d=>d.hashSetNames.Contains("WhatIamLookingFor")).FirstOrDefault();
这是一些复制,但它应该加快您的查询速度。原因是HashSet上的[Contains] [1]是O(1)操作,即,无论散列集中的元素数量如何,它都需要恒定的时间。
权衡是每次添加subObject时都必须为哈希集添加名称,并且在删除具有该名称的所有子对象或更改其名称时也删除该名称。无论何时创建索引,这都是经典的权衡:更快的查询时间是以较慢的插入和更新为代价的。
<强>更新强>
如果快速搜索子对象名称至关重要,那么您可以创建Dictionary<string, List<objectsListObjects>>
。我们称之为index
。 index
是从您搜索的subObject.name
到包含至少一个具有该名称的subObject
的对象列表的映射。当您向subObject
添加objectsListObject
时,您可以调用以下内容:
index[subObject.name].Add(objectsListObject);
然后,您可以检索具有您在O(1)中寻找的名称的对象列表,即只需索引到index
。显然它有自己的约束,特别是在更新subObjects中的名称时。
请注意,除了objectsList之外,通过创建单独的字典,您不将内存消耗加倍。字典和该字典中的列表仅包含对原始对象的引用,而不是完整副本。