快速搜索列表中对象中的嵌套对象?

时间:2014-06-08 17:06:52

标签: c# .net list search optimization

我有对象列表的优化问题。这些对象还包含其他对象的列表。我需要多次执行代码:

var result = objectsList.Where(d=>d.subObject.Where(w=>w.name == "WhatIamLookingFor").Count() > 0).FirstOrDefault();

此代码工作正常,但执行速度非常慢。如何提高绩效?

目前搜索执行约30秒。

2 个答案:

答案 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>>。我们称之为indexindex是从您搜索的subObject.name到包含至少一个具有该名称的subObject的对象列表的映射。当您向subObject添加objectsListObject时,您可以调用以下内容:

index[subObject.name].Add(objectsListObject);

然后,您可以检索具有您在O(1)中寻找的名称的对象列表,即只需索引到index。显然它有自己的约束,特别是在更新subObjects中的名称时。

请注意,除了objectsList之外,通过创建单独的字典,您将内存消耗加倍。字典和该字典中的列表仅包含对原始对象的引用,而不是完整副本。