7

如何使以下方法更具功能性 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;
    }
4

3 回答 3

15

要继续重复丢弃方式,只需分组并在组中取一个获胜项目(例如最后一个)。

first.Concat(second)
  .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
  .ToDictionary(g => g.Key, g => g.Last());
于 2012-04-05T19:43:00.900 回答
4

您可以直接使用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);
}

请注意,这将在重复键的情况下引发异常。

如果您需要处理重复键,则需要决定如何处理。例如,这将从“b”中删除重复项:

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);
}

要获得与原始行为相同的行为,您可以采用另一种方式(保留“b”中的 KeyValuePair 值):

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);
}
于 2012-04-05T19:37:44.297 回答
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);
}
于 2012-04-05T19:39:51.523 回答