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"];