C# Linq 合并两个字典
本文关键字:两个 字典 Linq 合并 | 更新日期: 2023-09-27 18:30:15
如何使下面的方法更具函数式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;
}
要继续重复的丢弃方式,只需分组并在组中拿一个获胜项目(例如最后一个)。
first.Concat(second)
.GroupBy(kvp => kvp.Key, kvp => kvp.Value)
.ToDictionary(g => g.Key, g => g.Last());
你可以直接使用 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);
}
也许是这样的。
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);
}