我正在寻找数据结构或优化的代码片段,它可以帮助我存储多个键映射到字符串值列表,以及我们如何使用多个键池中的任何一个密钥访问列表值。
让我把它们放在一个示例中。说密钥"Hi, "Hello", "how are you ?"
映射到VALUES "1234", "56789", "34567"
现在我可以使用任何一个键来获取VALUES列表(所有3个元素),例如" Hi"或"您好"或者"你好吗?"在一个声明中。
我试图避免在密钥列表中循环以匹配密钥。
答案 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)
操作。