C# 高效过滤大型多关键对象集

C# 高效过滤大型多关键对象集,c#,C#,我有很多项目,每个项目都有一些与之相关的代码。每个项目都有一个集合 List<ComplexObject> myCollection = new List<ComplexObject>(); var item = new ComplexObject() { Id = 5, Codes = new List<string>() { "1", "4", "5" }

我有很多项目,每个项目都有一些与之相关的代码。每个项目都有一个集合

List<ComplexObject> myCollection = new List<ComplexObject>();
var item = new ComplexObject() 
           { 
               Id = 5, 
               Codes = new List<string>() { "1", "4", "5" } 
           }; 
myCollection.Add(item);
但是,我希望能够通过代码进行过滤,而不必遍历所有对象——这就是这里发生的事情。在这种情况下,性能是至关重要的,因此我希望在这些对象上实现优于O(n)的查找时间

我曾经考虑过创建一个字典,将每一个代码作为一个键,并创建一个complexObjectId集合,但这似乎有点笨拙,但也许是最好的选择。在我的脑海里,我想象着某种网络收藏

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

因此,请使用扩展方法创建一个:

var lookup = myCollection
  .SelectMany(co => co.Codes.Select(code => new{code, co}))
  .ToLookup(x => x.code, x => x.co);
现在您可以查询查找了

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

在O(1)时间内。

那太好了。添加新条目时,此调用需要刷新,对吗?确实。。。如果它是一个实时的集合,您最好还是维护一个
IDictionary
。就性能而言,对于查找而言,它们大致相当。或者,如果您也需要删除项,
IDictionary
可能会提供更好的性能,但是如果您希望每个键有大量的条目,那么您需要为
ComplexObject
类实现合理的
GetHashCode
和相等成员。
IEnumerable<ComplexObject> complexObjs = lookup["1"];