C#中合并KeyValuePair列表并去除重复项的实现方法
嘿,这个需求用LINQ确实能轻松搞定,我给你捋清楚完整的实现流程,分几种常见情况来说明:
合并并去重
List<KeyValuePair<TKey, TValue>> 的方案 一、默认相等判断场景(Key和Value默认规则即可判定重复)
如果你的TKey和TValue是值类型(比如int、string这类),或者是已经正确实现了Equals和GetHashCode的引用类型,那直接用Union方法就能一步到位——它会自动合并两个列表,并且移除那些Key和Value完全相同的重复项:
var mergedList = a1.Union(a2).ToList();
你也可以用Concat搭配Distinct,效果完全一样:
var mergedList = a1.Concat(a2).Distinct().ToList();
这两种方式都会在遇到重复项时保留第一个出现的那个,符合你“保留任意一个即可”的要求。
二、自定义相等判断场景(比如需要忽略Value大小写、引用类型自定义比较逻辑)
如果默认的相等规则不满足你的需求,比如string类型的Value需要忽略大小写比较,那可以自定义一个相等比较器,再传给Union或Distinct:
// 针对Value为string类型的自定义比较器,忽略大小写 public class KeyValueIgnoreCaseComparer<TKey> : IEqualityComparer<KeyValuePair<TKey, string>> { public bool Equals(KeyValuePair<TKey, string> x, KeyValuePair<TKey, string> y) { // 先比较Key是否相等,再忽略大小写比较Value return EqualityComparer<TKey>.Default.Equals(x.Key, y.Key) && string.Equals(x.Value, y.Value, StringComparison.OrdinalIgnoreCase); } public int GetHashCode(KeyValuePair<TKey, string> obj) { // 哈希码生成要和比较逻辑对应,这里把Value转成小写再参与计算 return HashCode.Combine(obj.Key, obj.Value?.ToLowerInvariant()); } } // 使用示例 var mergedList = a1.Union(a2, new KeyValueIgnoreCaseComparer<TKey>()).ToList();
额外补充:如果需求是「Key相同就覆盖Value」
要是你的需求不是去重完全相同的项,而是只要Key相同就保留某一个(比如最后一个或第一个),那可以用字典来中转:
保留最后出现的相同Key的Value
// 转成字典时,后面的项会覆盖前面相同Key的项 var mergedDict = a1.Concat(a2).ToDictionary(kv => kv.Key, kv => kv.Value); var mergedList = mergedDict.ToList();
保留第一个出现的相同Key的Value
var mergedList = a1.Concat(a2) .GroupBy(kv => kv.Key) .Select(group => group.First()) .ToList();
内容的提问来源于stack exchange,提问作者Robo Maklen
相关产品推荐
相关产品推荐

