我有一本字典词典:
SortedDictionary<int,SortedDictionary<string,List<string>>>
我想合并两个词典,例如key = 2和key = 3。
非常重要我可以在相应的词典中使用重复的键。
示例key = 2有一个字典键,值"1000",{a,b,c}
和key = 3有一个字典键,值"1000",{z}
。
所以我想合并键2和键3,结果将是以下的Sorted Dictionary键,值"1000",{a,b,c,z}
。
我是LINQ语法的初学者,所以你可以用详细代码帮助解决这个问题..
由于
答案 0 :(得分:2)
这不是LINQ问题。这是一个可以解决您问题的通用版本。
static class SortedDictionaryExtensions {
public static void MergeKeys<TKey1, TKey2, TValue>(
this SortedDictionary<TKey1, SortedDictionary<TKey2, List<TValue>>> dictionary,
TKey1 intoKey,
TKey1 fromKey
) {
if (dictionary == null) {
throw new ArgumentNullException("dictionary");
}
if (intoKey == null) {
throw new ArgumentNullException("intoKey");
}
if (fromKey == null) {
throw new ArgumentNullException("fromKey");
}
SortedDictionary<TKey2, List<TValue>> to;
SortedDictionary<TKey2, List<TValue>> from;
if (!dictionary.TryGetValue(intoKey, out to)) {
throw new ArgumentOutOfRangeException("intoKey");
}
if (!dictionary.TryGetValue(fromKey, out from)) {
throw new ArgumentOutOfRangeException("fromKey");
}
foreach(TKey2 key in from.Keys) {
if (to.Keys.Contains(key)) {
to[key].AddRange(from[key]);
}
else {
to.Add(key, from[key]);
}
}
dictionary.Remove(fromKey);
}
}
用法:
SortedDictionary<int, SortedDictionary<string, List<string>>> list =
new SortedDictionary<int, SortedDictionary<string, List<string>>>();
list.Add(2, new SortedDictionary<string, List<string>>());
list[2].Add("1000", new List<string>() { "a", "b", "c" });
list[2].Add("2000", new List<string>() { "b", "c" });
list.Add(4, new SortedDictionary<string, List<string>>());
list[4].Add("1000", new List<string>() { "z" });
list[4].Add("3000", new List<string>() { "y" });
list.MergeKeys(2, 4);
以下是您如何处理这样的问题。首先,指定您要做的事情。
在字典中给出SortedDictionary<TKey1, SortedDictionary<TKey2, List<TValue>>>
和两个键intoKey
和fromKey
,将字典与键fromKey
合并到带有键intoKey
的字典中。< / p>
现在指定合并两个词典的含义。给定两个类型为to
from
和SortedDictionary<TKey2, List<TValue>>
的词典以进行合并意味着以下内容。对于TKey2 key
中的每个from
,有两种可能性:
key
位于to
。在这种情况下,请将列表from[key]
添加到列表to[key]
。key
不在to
。在这种情况下,将key
添加到to
,其值为from[key]
。然后,从字典中删除键fromKey
。
让我们将其转换为代码:
在字典中给出
SortedDictionary<TKey1, SortedDictionary<TKey2, List<TValue>>>
和两个键intoKey
和fromKey
SortedDictionary<TKey2, List<TValue>> to;
SortedDictionary<TKey2, List<TValue>> from;
// check that dictionary has intoKey
if (!dictionary.TryGetValue(intoKey, out to)) {
throw new ArgumentOutOfRangeException("intoKey");
}
// check that dictionary has fromKey
if (!dictionary.TryGetValue(fromKey, out from)) {
throw new ArgumentOutOfRangeException("fromKey");
}
对于
TKey2 key
中的每个from
,有两种可能性:
foreach(TKey2 key in from.Keys) {
// key is in to
if (to.Keys.Contains(key)) {
// add the list from[key] to the list to[key]
to[key].AddRange(from[key]);
}
// key is not in to
else {
// add an entry (key, from[key]) to the dictionary
to.Add(key, from[key]);
}
}
然后,从字典中删除键
fromKey
。
dictionary.Remove(fromKey);
其余代码只是错误检查
答案 1 :(得分:1)
LINQ在这里没什么用。
你应该遍历第二个字典中的每个KeyValuePair,调用TryGetValue
来找到第一个字典中密钥的相应子字典(如果它不在那里,添加它),然后重复该过程子词典,最后,将列表中的所有项目从第二个词典添加到第一个词典中的相应列表。
你应该能够相对容易地将它转换为C#;我们不会为您编写所有代码。