【发布时间】:2012-08-20 06:23:13
【问题描述】:
我有一个List<Thing> things,其中需要经常通过查找两个变量T1 f1 和T2 f2 的组合来检索多个Thing,这两个变量是值类型。我现在这样做的方式就是things.Where(t => t.Field1 == f1 && t.Field2 == f2)。但是,我经常进行大量此类查找,并且需要更有效的方法。
还好things不需要删除或添加元素,所以我想到了在构造上解析列表并添加到Dictionary<T1, Lookup<T2, Thing>>。但是,这感觉很混乱,尤其是在添加解析的情况下。如果我需要查找更多字段,它会变得非常棘手。三个字段看起来像Dictionary<T1, Dictionary<T2, Lookup<T3, Thing>>>。
我的下一个想法是创建一个Lookup<Tuple<T1,T2,T3,...>,Thing>。但在这种情况下,我不确定键是否真的可以工作,因为 Tuple 是一种引用类型。
即使我创建了 Lookup<ValueType<T1,T2,T3,...>,Thing> things,查找语句也会像 things[new ValueType<T1,T2,T3,...>(f1, f2, f3, ...)] 这样非常丑陋(我仍然不确定我是否可以信任这些密钥)。
有没有更优雅的解决方案来保持哈希表的性能优势,并且我可以简单地输入类似IEnumerable<Thing> found = things[f1, f2, f3, ...]; 的内容?
【问题讨论】:
-
您是否考虑过在内存数据库中使用 SQLite 之类的东西?
-
Thing是否具有标识属性(ID、PrimaryKey 或其他)? -
您可以使用
Tuples 作为字典键,因为它们是不可变的。如 MSDN 页面 (msdn.microsoft.com/en-us/library/xfhwa508.aspx) 所述,字典键的规则是,只要将其用作键,键的值就不能更改。该实现似乎使用哈希码。由于元组不会改变,并且随着时间的推移可能会产生相同的哈希码,所以它应该可以作为键。另请参阅:stackoverflow.com/questions/1483059/… -
这是一个相关问题,提供了一些很好的信息:stackoverflow.com/questions/955982/…
标签: c# .net dictionary