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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:26:51