C# добавление словаря

как я могу добавить словарь в другой словарь?

Dictionary<string, DateTime> odict = new Dictionary<string, DateTime>();
        //Liste tous les Clients EMAIL (3)
        foreach (var TheClientID in TheClient.GetClient_Id(3))
        {
            Dictionary<string, DateTime> Temp = oEmail.VoirEML(TheClientID.Key);
             //odict = odict.Concat(Temp).ToDictionary(pair => pair.Key, pair => pair.Value);
            odict = odict.SelectMany(toto => Temp)
                     .ToLookup(pair => pair.Key, pair => pair.Value)
                     .ToDictionary(group => group.Key, group => group.First());
        }

я хочу объединить/добавить словарь без двойной записи.


person user609511    schedule 16.10.2012    source источник
comment
Что вы хотите сделать с дубликатами ключей, если таковые имеются?   -  person James Michael Hare    schedule 16.10.2012
comment
На самом деле непонятно, что вы пытаетесь сделать в данный момент... не могли бы вы привести конкретные примеры?   -  person Jon Skeet    schedule 16.10.2012


Ответы (3)


Однажды я написал для этого метод расширения, потому что мне нужно было то же самое. Последний параметр определяет, что делать при обнаружении повторяющихся ключей.

Skip означает, что исходная запись сохранена.

Overwrite означает, что используется "другая" запись.

Throw вызовет исключение.

public enum DuplicateKeyHandling
{
    Skip,
    Overwrite,
    Throw
}

/// <summary>
/// Combines two dictionaries into one dictionary. The contents of the resulting dictionary depends on the <paramref name="duplicateKeyHandling"/> parameter.
/// </summary>
/// <typeparam name="TKey">The type of the keys in the dictionaries</typeparam>
/// <typeparam name="TValue">The type of the values in the dictionaries</typeparam>
/// <param name="this"></param>
/// <param name="other">The dictionary to combine this one with</param>
/// <param name="duplicateKeyHandling">Specifies how to react if the <paramref name="other"/> dictionary contains keys that are already in this dictionary</param>
/// <returns>A new dictionary containing the combined key-value-pairs of both source dictionaries</returns>
public static Dictionary<TKey, TValue> Combine<TKey, TValue>(this Dictionary<TKey, TValue> @this, Dictionary<TKey, TValue> other, DuplicateKeyHandling duplicateKeyHandling = DuplicateKeyHandling.Skip)
{
    // EDIT: I added the "comparer" parameter so the resulting dictionary will
    // use the same comparer as the first source dictionary
    var result = new Dictionary<TKey, TValue>(@this, @this.Comparer);

    foreach (KeyValuePair<TKey, TValue> kvp in other)
    {
        if (result.ContainsKey(kvp.Key))
        {
            if (duplicateKeyHandling == DuplicateKeyHandling.Overwrite)
            {
                result[kvp.Key] = kvp.Value;
            }

            if (duplicateKeyHandling == DuplicateKeyHandling.Throw)
            {
                throw new Exception("Duplicate key while combining dictionaries!");
            }
        }
        else
        {
            result.Add(kvp.Key, kvp.Value);
        }
    }

    return result;
}
person fero    schedule 16.10.2012

Я думаю, что попытка использовать Linq является ошибкой. Его легко писать и легко читать с помощью простого цикла, а методы расширения не будут более эффективными — возможно, менее эффективными.

    Dictionary<string, DateTime> odict = new Dictionary<string, DateTime>();
    //Liste tous les Clients EMAIL (3)
    foreach(var TheClientID in TheClient.GetClient_Id(3)) {
            Dictionary<string, DateTime> Temp = oEmail.VoirEML(TheClientID.Key);
            //odict = odict.Concat(Temp).ToDictionary(pair => pair.Key, pair => pair.Value);
            foreach(var kvp in Temp){
                    odict[kvp.Key] = kvp.Value;
        }
    }
person Alan Draper    schedule 16.10.2012

я пробую это:

odict = odict.Concat(Temp.Where(kvp => !odict.ContainsKey(kvp.Key))).ToDictionary(x => x.Key, x => x.Value);

и это работает нормально

person user609511    schedule 17.10.2012