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

如何对List<Dictionary<string, object>>按Name和Certification分组?

按Name和Certification分组并保留最新日期的实现方案

你的需求是将List<Dictionary<string, object>>按Name和Certification两个字段分组,每组只保留日期最新的条目。可以用LINQ快速实现,下面是具体步骤和代码:

核心思路

  1. 分组:以Name和Certification的组合作为分组键,把相同组合的条目归为一组。
  2. 筛选最新日期:对每个分组内的条目,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:10:22