我有一个使用 ConcurrentDictionary 实现的缓存, 我需要保留的数据取决于 5 个参数。 所以从缓存中获取的方法是:(为了简单起见,这里只显示了3个参数,为了清楚起见,我将数据类型改为代表CarData)
public CarData GetCarData(string carModel, string engineType, int year);
我想知道在我的 ConcurrentDictionary 中使用什么类型的键会更好,我可以这样做:
var carCache = new ConcurrentDictionary<string, CarData>();
// check for car key
bool exists = carCache.ContainsKey(string.Format("{0}_{1}_{2}", carModel, engineType, year);
或者像这样:
var carCache = new ConcurrentDictionary<Tuple<string, string, int>, CarData>();
// check for car key
bool exists = carCache.ContainsKey(new Tuple(carModel, engineType, year));
我不会在任何其他地方一起使用这些参数,因此没有理由创建一个类来将它们放在一起。
我想知道哪种方法在性能和可维护性方面更好。
最佳答案
I want to know which approach is a better in terms of performance and maintainability.
一如既往,您拥有解决问题的工具。对两种可能的解决方案进行编码并让它们竞赛。获胜者就是获胜者,您不需要这里的任何人来回答这个特定问题。
关于维护,autodocuments本身更好并且具有更好的可扩展性的解决方案应该是赢家。在这种情况下,代码是如此微不足道以至于自动文档不是什么大问题。从可扩展性的角度来看,恕我直言,最好的解决方案是使用 Tuple<T1, T2, ...>
:
- 你得到了你不需要的自由平等语义 维护。
碰撞是不可能的,如果你选择的话,这是不正确的 字符串拼接解决方案:
var param1 = "Hey_I'm a weird string"; var param2 = "!" var param3 = 1; key = "Hey_I'm a weird string_!_1"; var param1 = "Hey"; var param2 = "I'm a weird string_!" var param3 = 1; key = "Hey_I'm a weird string_!_1";
是的,牵强附会,但理论上完全有可能,而且您的问题恰恰是关于 future 未知事件的,所以...
最后但同样重要的是,编译器帮助您维护代码。例如,如果明天您必须添加
param4
给你的 key ,Tuple<T1, T2, T3, T4>
将强烈键入您的 key 。另一方面,您的字符串连接算法可以在没有param4
的情况下幸福地生成 key 。直到您的客户调用您,您才知道发生了什么,因为他们的软件没有按预期工作。
关于c# - 元组与字符串作为 C# 中的字典键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41932542/