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

4

This question already has an answer here:

Combine two Dictionaries with LINQ 6 answers

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

<code>    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;
    }
</code>
Какое поведение вы намереваетесь, если между двумя словарями происходит столкновение клавиш? Eric J.
@ericj .: используется значение из b michaelr524

Ваш Ответ

3   ответа
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());
Это на самом деле будет иметь противоположное поведение - значения из & quot; first & quot; будет храниться, где OP всегда будет получать значения из «second» (То есть:g.Last() или обратный конкат)
@ davidb Я думаю, что это самое элегантное решение michaelr524
@ReedCopsey включен путем редактирования, спасибо.
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);
}
@HenkHolterman Да - я редактировал, чтобы показать, как этого избежать ...
@reedcopsey выглядит хорошо, теперь я думаю, что было бы наиболее эффективным решением :) michaelr524
Ведет себя по-разному в отношении дубликатов. Эта версия кидает.

Похожие вопросы