4

Вопрос по merge, linq, c# – C # Linq объединить два словаря [дубликат]

This question already has an answer here:

Как сделать следующий метод более функциональным в стиле linq?

    public static Dictionary<T, T> MergeDict<T, T>(Dictionary<T, T> a, Dictionary<T, T> b)
    {
        var e = new Dictionary<T, T>();

        a.Concat(b).ToList().ForEach(pair =>
        {
            e[pair.Key] = pair.Value;
        });

        return e;
    }
  • @HenkHolterman Да - я редактировал, чтобы показать, как этого избежать ...

    от
  • @reedcopsey выглядит хорошо, теперь я думаю, что было бы наиболее эффективным решением :)

    от michaelr524
  • Ведет себя по-разному в отношении дубликатов. Эта версия кидает.

    от
  • @ReedCopsey включен путем редактирования, спасибо.

    от
  • Это на самом деле будет иметь противоположное поведение - значения из & quot; first & quot; будет храниться, где OP всегда будет получать значения из «second» (То есть:g.Last() или обратный конкат)

    от
  • @ davidb Я думаю, что это самое элегантное решение

    от michaelr524
  • Какое поведение вы намереваетесь, если между двумя словарями происходит столкновение клавиш?

    от Eric J.
  • @ericj .: используется значение из b

    от michaelr524
  • 0

    Возможно, как-то так.

    public static IDictionary<T, U> Merge<T, U>(this IDictionary<T, U> first, IDictionary<T, U> second)
    {
        return first.Concat(second).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    }
    

  • 9

    Чтобы продолжить удаление дубликатов

    просто сгруппируйте и возьмите в группе выигрышный предмет (например, Последний).

    first.Concat(second)
      .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
      .ToDictionary(g => g.Key, g => g.Last());
    

  • 3

    Вы могли бы использовать

    ToDictionary непосредственно:

    public static Dictionary<T, T> MergeDict<T, T>(Dictionary<T, T> a, Dictionary<T, T> b)
    {
         return a.Concat(b).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    }
    

    Имейте в виду, что это приведет к исключению в случае дубликатов ключей.

    Если вам нужно обработать дубликаты ключей, вам нужно решить, как вы хотите, чтобы это обрабатывалось. Например, это удалит дубликаты из & quot; b & quot ;:

    public static Dictionary<T, T> MergeDict<T, T>(Dictionary<T, T> a, Dictionary<T, T> b)
    {
         return a.Concat(b.Where(kvp => !a.ContainsKey(kvp.Key)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    }
    

    Чтобы получить то же поведение, что и оригинал, вы можете пойти другим путем (сохраняет значения KeyValuePair в & quot; b & quot;):

    public static Dictionary<T, T> MergeDict<T, T>(Dictionary<T, T> a, Dictionary<T, T> b)
    {
         return b.Concat(a.Where(kvp => !b.ContainsKey(kvp.Key)).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    }