使用大量对象,需要更好(排序)的性能

时间:2014-09-24 19:00:35

标签: c# list loops data-structures

我有一个巨大的(~100,000)对象集合,我无法控制(让我们调用这个masterList)。它们很简单,有几个字段

public class TheirObject{
public String GUID;
public int blah1;
public string blah2;
...
}

我有另外几万个GUID(作为字符串列表)的集合,我需要为列表中的每个GUID创建一个子对象列表,其中包含masterList中的任何一个对象具有相同的GUID。

这是一些简单的代码:

 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
 }

但是,这需要小时!我确信有一种更多更快的方法,包括排序列表的perhaphs,然后是二进制搜索查找,但我无法弄清楚如何在c#中完成它。几个TheyObjects在masterList中具有相同的GUID,所以我不认为我可以使用SortedList。救命啊!

1 个答案:

答案 0 :(得分:7)

使用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)。

现在,如果列表非常庞大且内存限制不允许您构建更适合查找的数据结构,我可能会尝试将工作卸载到数据库中,如评论中所示。