字典合并

时间:2009-12-21 23:57:44

标签: c# dictionary merge

我有一本字典词典:

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语法的初学者,所以你可以用详细代码帮助解决这个问题..

由于

2 个答案:

答案 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>>>和两个键intoKeyfromKey,将字典与键fromKey合并到带有键intoKey的字典中。< / p>

现在指定合并两个词典的含义。给定两个类型为to fromSortedDictionary<TKey2, List<TValue>>的词典以进行合并意味着以下内容。对于TKey2 key中的每个from,有两种可能性:

  1. key位于to。在这种情况下,请将列表from[key]添加到列表to[key]
  2. key不在to。在这种情况下,将key添加到to,其值为from[key]
  3. 然后,从字典中删除键fromKey

    让我们将其转换为代码:

      

    在字典中给出SortedDictionary<TKey1, SortedDictionary<TKey2, List<TValue>>>和两个键intoKeyfromKey

    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#;我们不会为您编写所有代码。