C#按月分组:如何找出每月营收最高的期刊?
嘿,我来帮你搞定这个需求!先看看你的现有代码,咱们一步步调整来实现每个月营收最高期刊的统计。
实现每个月营收最高期刊的方案
首先得先重构原代码的统计逻辑——原来的写法每次循环都会重置数组和字典,根本没法累积所有期刊的营收数据。咱们换个更合理的数据结构来存所有月份、对应期刊的营收总和:
// 定义嵌套字典:外层键是月份(1-12),内层是该月份下各期刊的营收总和 var monthlyEditionRevenue = new Dictionary<int, Dictionary<Leidinys, decimal>>(); // 先初始化每个月份的空字典,避免后续判断null的麻烦 for (int month = 1; month <= 12; month++) { monthlyEditionRevenue[month] = new Dictionary<Leidinys, decimal>(); } // 遍历所有期刊 for (b.Pradzia(); b.Yra(); b.Kitas()) { var currentEdition = b.ImtiDuomenisL(); // 你之前注释掉的订阅者循环得打开哦,不然没法遍历所有订阅数据 for (a.Pradzia(); a.Yra(); a.Kitas()) { var currentSubscriber = a.ImtiDuomenisP(); // 匹配期刊代码才继续计算 if (currentEdition.Kodas == currentSubscriber.Kodas) { int subscriptionStart = currentSubscriber.LaikotarpioPradžia; int subscriptionLength = currentSubscriber.LaikotarpioIlgis; int subscriptionEnd = subscriptionStart + subscriptionLength; // 遍历订阅覆盖的每个月份 for (int i = subscriptionStart; i <= subscriptionEnd; i++) { // 处理跨年度的月份(比如13月转到下一年1月),和你原逻辑保持一致 int targetMonth = i <= 12 ? i : i - 12; // 计算该订阅在当前月份的营收 decimal revenue = currentSubscriber.Kiekis * currentEdition.Kaina; // 把营收累积到对应月份的期刊数据里 if (monthlyEditionRevenue[targetMonth].ContainsKey(currentEdition)) { monthlyEditionRevenue[targetMonth][currentEdition] += revenue; } else { monthlyEditionRevenue[targetMonth][currentEdition] = revenue; } } } } }
接下来就可以遍历每个月份,找出营收最高的期刊了。这里分两种情况给你代码,适配不同的.NET版本:
// 存储最终结果:键是月份,值是(营收最高的期刊, 对应营收总额) var topEditionPerMonth = new Dictionary<int, (Leidinys TopEdition, decimal MaxRevenue)>(); foreach (var monthEntry in monthlyEditionRevenue) { int month = monthEntry.Key; var editionRevenues = monthEntry.Value; if (editionRevenues.Count == 0) { // 该月份没有营收,你可以根据需求自行处理,比如设为null topEditionPerMonth[month] = (null, 0); continue; } // --- .NET 6及以上版本用这个,代码更简洁 --- var topEntry = editionRevenues.MaxBy(kv => kv.Value); topEditionPerMonth[month] = (topEntry.Key, topEntry.Value); // --- 如果是.NET 5及以下版本,用下面这段替代上面的代码 --- // decimal maxRevenue = 0; // Leidinys topEdition = null; // foreach (var kv in editionRevenues) // { // if (kv.Value > maxRevenue) // { // maxRevenue = kv.Value; // topEdition = kv.Key; // } // } // topEditionPerMonth[month] = (topEdition, maxRevenue); } // 举个输出结果的例子 foreach (var entry in topEditionPerMonth) { Console.WriteLine($"月份 {entry.Key}: 营收最高的期刊是 {entry.Value.TopEdition?.Pavadinimas},营收总额 {entry.Value.MaxRevenue:C}"); }
关键说明
- 用嵌套字典替代了原来的临时数组,确保所有期刊的营收数据都能被正确累积
- 保留了你原代码中跨年度月份的处理逻辑
- 分版本提供了找最大值的方法,兼顾新老项目
- 最终的
topEditionPerMonth字典可以直接拿来用,轻松获取每个月的最高营收期刊数据
内容的提问来源于stack exchange,提问作者Meiko
相关产品推荐
相关产品推荐

