.Net:值列表的多个键
.Net : multiple keys to list of values
我正在寻找数据结构或优化的代码片段,它们可以帮助我存储映射到字符串值列表的多个键,以及我们使用多个键池中的任何一个键访问列表值的效率。
让我把这些放在示例中。说键是 "Hi, "Hello", "how are you ?"
映射到 VALUES "1234", "56789", "34567"
现在我可以在单个语句中使用 "Hi" 或 "Hello" 或 "how are you ?" 等键中的任何一个来获取 VALUES 列表(所有 3 个元素)。
我试图避免循环遍历密钥列表来匹配密钥。
使用 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)
操作。
我正在寻找数据结构或优化的代码片段,它们可以帮助我存储映射到字符串值列表的多个键,以及我们使用多个键池中的任何一个键访问列表值的效率。
让我把这些放在示例中。说键是 "Hi, "Hello", "how are you ?"
映射到 VALUES "1234", "56789", "34567"
现在我可以在单个语句中使用 "Hi" 或 "Hello" 或 "how are you ?" 等键中的任何一个来获取 VALUES 列表(所有 3 个元素)。
我试图避免循环遍历密钥列表来匹配密钥。
使用 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)
操作。