更好地替代查找表的嵌套字典

时间:2018-04-14 13:53:54

标签: c# design-patterns lookup-tables

当构建超过单个维度的查找表时,我发现自己嵌套了很多字典:

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个密钥的缓存机制,字典字段定义有点荒谬。

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

1 个答案:

答案 0 :(得分:0)

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}");