.Net:值列表的多个键

时间:2017-11-04 10:00:13

标签: c# .net dictionary data-structures key-value

我正在寻找数据结构或优化的代码片段,它可以帮助我存储多个键映射到字符串值列表,以及我们如何使用多个键池中的任何一个密钥访问列表值。

让我把它们放在一个示例中。说密钥"Hi, "Hello", "how are you ?"映射到VALUES "1234", "56789", "34567"

现在我可以使用任何一个键来获取VALUES列表(所有3个元素),例如" Hi"或"您好"或者"你好吗?"在一个声明中。

我试图避免在密钥列表中循环以匹配密钥。

1 个答案:

答案 0 :(得分:0)

使用Dictionary<string, List<string>,其中映射到同一列表的不同键共享相同的列表引用。

上面的示例:

var values = new List<string> { "1234", "56789", "34567" };
var mapping = new Dictionary<string, List<string>>
{
    ["Hi"] = values,
    ["Hello"] = values,
    ["how are you ?"] = values
};

然后通过索引器访问将检索所有这些键(mapping["Hi"] == mapping["Hello"])的相同引用。

如果您的数据以密钥和值列表的形式存在,那么您可以使用以下内容为其创建扁平字典:

var rawData = new List<(List<string> keys, List<string> values)>
{
    (new List<string> {"Hi", "Hello", "how are you ?" }, new List<string> {"1234", "56789", "34567" })
};

var result = rawData.SelectMany(item => item.keys.Select(k => (k, item.values)))
                    .ToDictionary(key => key.k, val => val.values);

请注意,为了便于编写,我使用了C#7.0的命名元组。当然,也可以使用自定义类或linq部分中的匿名类型

在构造数据结构时,它会查看所有键,因此它仍然是O(n)操作,但是使用任何键访问值都是O(1)操作。