【问题标题】:Better alternative to nesting dictionaries for lookup tables查找表嵌套字典的更好替代方法
【发布时间】:2018-09-24 17:02:26
【问题描述】:

在构建超过单一维度的查找表时,我发现自己经常嵌套字典:

public class MyLookupTable
{
    IDictionary<T1, IDictionary<T2, ISet<T3>>> mapOfMapOfSequences;

    // Update the table
    public void AddItem(T3 myItem);

    // Access the table
    public IEnumerable<T3> GetItems(T1 key1, T2 key2);
}

到目前为止,这对我来说效果很好,尽管需要编写一些冗长的 ContainsKey 条件来访问/修改表。

最近在写一个有5个key的缓存机制,字典字段定义有点可笑。

在架构上,是否有一种我完全忽略的设计模式可以让这个问题更易于管理?

【问题讨论】:

  • 谢谢!这绝对为我指明了正确的方向。
  • 看起来你做得很好。您有一个自定义类型来包装要正确使用的字典(我假设看到您提供的 sn-p),并且字典的查找和存储速度非常快。就个人而言,除非我看到所有代码,否则我不会提出更好的方法,即使那样我也确信你做得很好。
  • 对于您的情况,复合键可能有意义。但是,这取决于用例。例如,如果您需要知道给定主键存在多少个辅助键值,那么嵌套形式将使该操作更有效。

标签: c# design-patterns lookup-tables


【解决方案1】:

ValueTuples 有助于为像您这样的场景创建临时类型。

你可以像这样声明一个字典:

IDictionary<(T1, T2, T3, T4, T5), TValue> dictionary;

像这样添加值

dictionary.Add((k1, k2, k3, k4, k5), value);

您可以在文章Dissecting the tuples in C# 7 (MSDN) 中找到示例。

你也可以命名元组项

IDictionary<(T1 key1, T2 key2, T3 key3, T4 key4, T5 key5), TValue> dictionary;

dictionary.Add((key1: k1, key2: k2, key3: k3, key4: k4, key5: k5), value);

当然,您会选择适合您的问题的口语名称。给定一个键,您可以像这样访问元组项:

var key = dictionary.Keys.First();
T3 k3 = key.key3;

或用

解构密钥
var (k1, k2, k3, k4, k5) = dictionary.Keys.First();
Console.WriteLine($"Key 3 is {k3}");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多