如何统计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
相关产品推荐
相关产品推荐

