【问题标题】:.Net : multiple keys to list of values.Net:值列表的多个键
【发布时间】:2018-04-16 23:56:41
【问题描述】:

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

让我把这些放在一个示例中。说键是 "Hi, "Hello", "how are you ?" 映射到 VALUES "1234", "56789", "34567"

现在我可以使用“Hi”或“Hello”或“你好吗?”等任何一个键来获取 VALUES 列表(所有 3 个元素)。在一个语句中。

我试图避免循环遍历密钥列表以匹配密钥。

【问题讨论】:

  • 你试过了吗?
  • 如果你有 3 个键,循环是迄今为止最有效的解决方案。

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


【解决方案1】:

使用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) 操作。

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 2021-09-17
    • 2021-11-17
    相关资源
    最近更新 更多