c# - 元组与字符串作为 C# 中的字典键

标签 c# .net caching equality concurrentdictionary

我有一个使用 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/

相关文章:

c# - 在Windows服务中使用计时器

.htaccess - htaccess的缓存和gzip压缩

.net - VS 2010 Performance Profiler : Identifying Threads

c# - 可以将null插入到Cache中吗?

asp.net - 阅读 appsettings.json 很贵吗?

c# - 如何在 asp net core 3.1 中保持托管服务的事件状态?

c# - 自定义 TraceListener 和多条消息

c# - 统一 5.8 : registration by convention "Inheritance security rules violated"

c# - YamDocument 以 3 个点结尾的文本表示

python - 如何捕获 Windows 计算机上的所有用户事件 [不是任何特定于应用程序]?