如何对List<Dictionary<string, object>>按Name和Certification分组?
按Name和Certification分组并保留最新日期的实现方案
你的需求是将List<Dictionary<string, object>>按Name和Certification两个字段分组,每组只保留日期最新的条目。可以用LINQ快速实现,下面是具体步骤和代码:
核心思路
- 分组:以
Name和Certification的组合作为分组键,把相同组合的条目归为一组。 - 筛选最新日期:对每个分组内的条目,将
Date字符串转换为DateTime类型(避免字符串排序的误差),按日期降序排序后取第一个,就是该组最新的条目。
完整代码实现
using System; using System.Collections.Generic; using System.Linq; // 你的原始集合 var myList = new List<Dictionary<string, object>> { new Dictionary<string, object> { { "Name", "Bob" }, { "Certification", "Certification A" }, { "Date", "10/1/2022" } }, new Dictionary<string, object> { { "Name", "Bob" }, { "Certification", "Certification A" }, { "Date", "01/01/2022" } }, new Dictionary<string, object> { { "Name", "Bob" }, { "Certification", "Certification B" }, { "Date", "10/5/2022" } }, new Dictionary<string, object> { { "Name", "Joe" }, { "Certification", "Certification A" }, { "Date", "10/5/2022" } }, new Dictionary<string, object> { { "Name", "Joe" }, { "Certification", "Certification B" }, { "Date", "10/5/2022" } }, new Dictionary<string, object> { { "Name", "Joe" }, { "Certification", "Certification B" }, { "Date", "01/01/2022" } } }; // 分组并筛选最新日期的逻辑 var result = myList .GroupBy(item => new { Name = item["Name"].ToString(), Certification = item["Certification"].ToString() }) .Select(group => group.OrderByDescending(item => DateTime.Parse(item["Date"].ToString())) .First()) .ToList(); // 输出验证(可选) foreach (var item in result) { Console.WriteLine($"Name: {item["Name"]}, Certification: {item["Certification"]}, Date: {item["Date"]}"); }
关键细节说明
- 分组键的选择:用匿名类型
{Name, Certification}作为分组键,匿名类型会自动按属性值进行相等比较,能准确把相同Name和Certification的条目分到一组。 - 日期转换的必要性:如果直接按
Date字符串排序,会出现"01/01/2022"排在"10/1/2022"前面的错误(字符串按字符顺序比较),转换为DateTime后才能正确比较日期先后。 - 异常处理(可选):如果集合中存在
Date字段缺失、格式不正确的情况,可以用DateTime.TryParse代替DateTime.Parse,避免程序崩溃:
.OrderByDescending(item => { DateTime.TryParse(item["Date"].ToString(), out var date); return date; })
执行上述代码后,就能得到你需要的结果集合。
内容的提问来源于stack exchange,提问作者Dev 404
相关产品推荐
相关产品推荐

