Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找表嵌套字典的更好选择_C#_Design Patterns_Lookup Tables - Fatal编程技术网

C# 查找表嵌套字典的更好选择

C# 查找表嵌套字典的更好选择,c#,design-patterns,lookup-tables,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 IEnumerabl

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

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);
}
公共类MyLookupTable
{
最小层序的索引图;
//更新表
公共无效附加项(T3 myItem);
//进入表格
公共IEnumerableGetItems(T1键1、T2键2);
}
尽管需要编写一些冗长的ContainsKey条件来访问/修改表,但到目前为止,这对我来说非常有效

最近我写了一个缓存机制,它有5个键,字典字段的定义有点荒谬

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

有助于为您这样的场景创建特殊类型

您可以这样声明字典:

IDictionary<(T1, T2, T3, T4, T5), TValue> dictionary;
var key = dictionary.Keys.First();
T3 k3 = key.key3;
您可以在文章(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 (k1, k2, k3, k4, k5) = dictionary.Keys.First();
Console.WriteLine($"Key 3 is {k3}");

非常感谢。这无疑为我指明了正确的方向。看起来你做得很好。您有一个自定义类型来包装要正确使用的词典(我假设看到了您提供的代码段),并且词典的查找和存储速度非常快。就我个人而言,我不会建议更好的方法,除非我看到了所有的代码,即使这样,我相信你做得很好。对于你的情况,复合键可能会有意义。然而,这取决于用例。例如,如果您需要知道给定主键存在多少个辅助键值,那么嵌套表单将使该操作更加高效。
var (k1, k2, k3, k4, k5) = dictionary.Keys.First();
Console.WriteLine($"Key 3 is {k3}");