使用大量对象列表时,需要更好的(排序的)性能
本文关键字:更好 排序 性能 对象 列表 | 更新日期: 2023-09-27 18:24:12
我有一个庞大的(约100000)对象集合,我无法控制这些对象(让我们称之为masterList)。它们很简单,有几个字段
public class TheirObject{
public String GUID;
public int blah1;
public string blah2;
...
}
我有另一个数万个GUID的集合(作为字符串列表),我需要为列表中的每个GUID创建一个TheirObjects的子列表,该子列表包含master列表中具有相同GUID的TheirObjects。
这里有一些简单的代码可以做到这一点:
List<String> GUIDs;
List<TheirObject> masterList;
List<TheirObject> filteredList;
foreach(String GUID in GUIDs)
{
filteredList = new List<TheirObject>();
foreach(TheirObject tho in masterList)
if(tho.GUID == GUID)
filteredList.Add(tho);
//do stuff with filteredList
}
但是,这需要小时!我确信有一种更快的方法可以做到这一点,可能涉及排序列表,然后是二进制搜索查找,但我不知道如何在c#中实现这一点。多个TheirObject在master列表中具有相同的GUID,所以我认为我不能使用SortedList。帮助
LINQ的直接代码方法类似于:
var lookup = masterList.ToLookup(tho => tho.GUID);
// Now you have a hash-table based lookup containing the lists of TheirObject grouped by GUID
foreach(string GUID in GUIDs)
{
filteredList = lookup[GUID].ToList();
// Do your stuff with filteredList
}
这里的关键是不要多次迭代庞大的列表,这会影响性能。相反,迭代一次并构建一个高效的查找。这个初始构建将需要一些时间,后续查找几乎不需要时间,并且(接近)O(1)。
现在,如果列表非常庞大,并且内存限制不允许您构建更适合查找的数据结构,我可能会尝试将工作卸载到数据库中,如注释中所建议的那样。