You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:21