如何用LINQ从IGrouping<DateTime, Option>筛选Root唯一的Option对象
解决IGrouping集合中筛选Root唯一Option的问题
嘿,我来帮你搞定这个LINQ的筛选需求!你手里的IGrouping<DateTime, Option>应该是一个分组后的序列(也就是IEnumerable<IGrouping<DateTime, Option>>),想要筛选出Root值唯一的Option对象,我分两种常见情况给你提供解决方案:
情况1:筛选全局范围内Root唯一的Option
如果你想要的是所有分组里,Root值只出现过一次的Option,我们可以先把所有分组的Option平铺,统计每个Root的出现次数,再筛选出次数为1的项:
// 先把所有分组中的Option平铺成一个单独的序列 var allOptions = groupedData.SelectMany(group => group); // 统计每个Root对应的出现次数 var rootOccurrenceCount = allOptions .GroupBy(opt => opt.Root) .ToDictionary(group => group.Key, group => group.Count()); // 筛选出Root仅出现一次的Option var uniqueRootOptions = allOptions .Where(opt => rootOccurrenceCount[opt.Root] == 1); // 遍历结果 foreach (var option in uniqueRootOptions) { // 这里写你的业务逻辑,比如打印或处理Option Console.WriteLine($"Root: {option.Root}, Price: {option.Price}"); }
情况2:每个分组内筛选Root唯一的Option
如果你的需求是在每个DateTime分组里,同一个Root只保留一个(比如每个日期分组里,相同Root只留第一个/价格最高的),可以在遍历分组时,对每个分组内部再按Root分组去重:
foreach (var dateGroup in groupedData) { // 在当前日期分组内,按Root分组,取每个Root对应的第一个Option(可按需替换逻辑) var uniqueRootInGroup = dateGroup .GroupBy(opt => opt.Root) .Select(rootGroup => rootGroup.First()); // 若要取价格最高的,可换成rootGroup.MaxBy(opt => opt.Price) // 遍历当前分组内Root唯一的Option foreach (var option in uniqueRootInGroup) { Console.WriteLine($"日期: {dateGroup.Key}, Root: {option.Root}, 价格: {option.Price}"); } }
额外提示
如果你需要保留每个Root对应的特定Option(比如价格最高/最低的),可以把Select(rootGroup => rootGroup.First())替换成:
- .NET 6及以上:
rootGroup.MaxBy(opt => opt.Price)或rootGroup.MinBy(opt => opt.Price) - 更早版本:
rootGroup.OrderByDescending(opt => opt.Price).First()
内容的提问来源于stack exchange,提问作者challengeAccepted
相关产品推荐
相关产品推荐

