有效过滤大量多关键对象

时间:2014-05-26 23:17:39

标签: c#

我有许多项目,每个项目都有许多与之关联的代码。每个项目都有这些的集合。

List<ComplexObject> myCollection = new List<ComplexObject>();
var item = new ComplexObject() 
           { 
               Id = 5, 
               Codes = new List<string>() { "1", "4", "5" } 
           }; 
myCollection.Add(item);

我需要按需按代码过滤这些对象。将有许多条目,可能> 1,000,000,每个条目都包含一组关联的密钥。

我显然可以使用类似的东西:

var output = (from p in myCollection
             from q in p.Codes
             where q == x
             select p).ToList();

但是,我希望能够通过代码进行过滤而无需遍历所有对象 - 这就是这里发生的事情。在这种情况下,性能至关重要,因此我希望在这些对象上实现比O(n)更好的查找时间。

我考虑创建一个将每个代码作为键的字典,以及一个ComplexObjectIds的集合,但这看起来有点笨拙 - 但也许它是最好的选择。在我的脑海中,我设想了某种网络收藏......

鉴于性能是我的最终目标,是否有更优化的方法?

1 个答案:

答案 0 :(得分:1)

所以使用ILookup扩展方法创建.ToLookup

var lookup = myCollection
  .SelectMany(co => co.Codes.Select(code => new{code, co}))
  .ToLookup(x => x.code, x => x.co);

现在您可以查询查找

IEnumerable<ComplexObject> complexObjs = lookup["1"];  

在O(1)时间。