Dav*_* S. 6 .net c# dictionary
我有一个List<Thing> things,其中一些Thing需要通过看两个变量的组合经常检索小号T1 f1和T2 f2,这是值类型.我现在这样做的方式很简单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, ...];?
Lookup<Tuple<T1,T2,T3,...>,Thing>会起作用,因为Tuple覆盖了Equals和GetHashCode。
为了使查找语法不那么难看,您可以使用Tuple.Create支持类型推断的。你的代码变成了things[Tuple.Create(f1, f2, f3, ...)]. 如果这仍然太难看,那么添加一个将各个值作为参数的辅助方法就很简单了。
我还会考虑为键创建我自己的不可变类(或值类型),这样您就可以得到干净的字段名称而不是ItemX. 您只需要覆盖Equals并GetHashCode始终如一。
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |