如何用LINQ对C# List<string>中的重复值分组并统计次数?
使用LINQ实现字符串分组统计并排序
方法语法实现
用GroupBy分组后配合Count统计次数,再排序就能得到你要的结果,代码如下:
List<string> myList = new List<string> { "black", "red", "green", "green", "red", "green", "blue" }; // 分组、统计、排序 var groupedData = myList .GroupBy(str => str) // 按字符串内容分组 .Select(group => new { Color = group.Key, Occurrences = group.Count() }) .OrderByDescending(item => item.Occurrences) // 按出现次数降序排列 .ThenBy(item => item.Color); // 次数相同时按字符串字典序升序(可选) // 转换成字典(和你想要的结构一致) var resultDict = groupedData.ToDictionary(item => item.Color, item => item.Occurrences);
代码说明
GroupBy(str => str):把列表中相同的字符串归为一组,每组的Key就是对应的字符串。Select(...):从每个分组里提取字符串本身和该组的元素数量(也就是出现次数),生成包含这两个信息的匿名对象。OrderByDescending(...):让出现次数多的排在前面,符合你示例里的顺序。ThenBy(...):当多个字符串出现次数相同时,按字符串的字典序排序,比如示例里的black和blue会按顺序排列。
查询语法实现(另一种写法)
如果你习惯LINQ的查询语法,也可以这样写:
var groupedData = from str in myList group str by str into colorGroup orderby colorGroup.Count() descending, colorGroup.Key select new { Color = colorGroup.Key, Occurrences = colorGroup.Count() }; var resultDict = groupedData.ToDictionary(item => item.Color, item => item.Occurrences);
输出结果验证
如果要打印出你示例中的格式,可以遍历字典:
Console.WriteLine("{"); foreach (var entry in resultDict) { Console.WriteLine($" \"{entry.Key}\": {entry.Value},"); } Console.WriteLine("}");
运行后会输出:
{ "green": 3, "red": 2, "black": 1, "blue": 1, }
内容的提问来源于stack exchange,提问作者SlappingTheBass12
相关产品推荐
相关产品推荐

