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

如何统计C#列表中重复Key-Value键值对的出现次数?

统计重复Key-Value键值对的出现次数

嘿,我看你已经搞定了竖线分隔文本的读取,还把指定字段存成了Data对象的列表,现在要统计重复键值对的出现次数对吧?这事儿用LINQ就能轻松解决,但得注意一个关键细节:你的Data是自定义类,默认情况下C#会按对象引用判断是否相等,而不是按Key和Value的实际值,所以直接分组可能达不到预期效果。下面给你几种可行的方案:

方案1:重写Data类的Equals和GetHashCode方法

这是最彻底的方式,以后只要需要比较Data对象的内容,都能直接用。修改你的Data类:

class Data 
{ 
    public string Key { get; set; } 
    public string Value { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Data other)
        {
            // 按Key和Value的实际值判断是否相等
            return Key == other.Key && Value == other.Value;
        }
        return false;
    }

    public override int GetHashCode()
    {
        // 组合Key和Value的哈希值,确保相同内容的对象哈希值一致
        return HashCode.Combine(Key, Value);
    }
}

之后用LINQ分组统计:

// 生成键为Data对象、值为出现次数的字典
var countDict = KeyValue.GroupBy(d => d)
                        .ToDictionary(g => g.Key, g => g.Count());

你可以遍历这个字典,查看每个键值对的出现次数。

方案2:用匿名类型临时分组

如果你不想修改Data类,或者只是临时需要统计,用匿名类型就很方便——匿名类型会自动根据属性值生成Equals和GetHashCode方法:

// 生成包含Key、Value和对应次数的列表
var countResult = KeyValue.GroupBy(d => new { d.Key, d.Value })
                          .Select(g => new 
                          {
                              Key = g.Key.Key,
                              Value = g.Key.Value,
                              Count = g.Count()
                          })
                          .ToList();

直接遍历这个列表,就能清晰看到每个键值对的重复次数。

方案3:使用Tuple<string, string>

如果觉得匿名类型不够直观,也可以把每个Data对象转换成Tuple,Tuple同样会按值进行比较:

var countDict = KeyValue.Select(d => Tuple.Create(d.Key, d.Value))
                        .GroupBy(t => t)
                        .ToDictionary(g => g.Key, g => g.Count());

之后通过countDict.Keys获取所有唯一的键值对,countDict[tuple]就能拿到对应的出现次数。

选哪种方案看你的实际需求:临时统计用方案2最省事,要是以后经常要用到Data对象的内容比较,方案1更合适。

内容的提问来源于stack exchange,提问作者HarshSharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:14:37