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

C#遍历Payment列表打印应税金额时重复输出首个值的问题

问题:遍历列表时重复输出第一个计算值,而非每个项的对应结果

问题现象

尝试遍历Payment列表,计算每个项的英国应税金额并打印,但实际输出全部是第一个项的计算结果(2250.00 GBP),无法得到每个项的对应值。

相关代码

Payment类定义

public class Payment
{
    // 员工在某段时间内赚取的总金额(英镑,可对应月薪、季度奖金、每周洗衣补贴等)
    public decimal TotalAmount { get; set; }

    // 该支付周期内员工在英国工作的天数
    public int UkWorkdayCount { get; set; }

    // 该支付周期内员工在英国以外国家工作的天数
    public int ForeignWorkdayCount { get; set; }
}

原计算方法

public static decimal CalculateUkTaxableAmount(List<Payment> payments)
{
    decimal totalTaxableAmount = 0;

    foreach (Payment payment in payments)
    {
        var totalAmount = payment.TotalAmount;
        var ukWorkdayCount = payment.UkWorkdayCount;
        var foreignWorkdayCount = payment.ForeignWorkdayCount;

        // 将工作日数转换为decimal类型用于计算
        decimal ukWorkdayDecimal = ukWorkdayCount;
        decimal foreignWorkdayDecimal = foreignWorkdayCount;

        totalTaxableAmount = totalAmount * (ukWorkdayDecimal / (ukWorkdayDecimal + foreignWorkdayDecimal));

        return totalTaxableAmount;  
    }

    return totalTaxableAmount;
}

原主方法

public static void Main()
{
    var payments = new List<Payment>
    {
        new Payment { TotalAmount = 3000m, UkWorkdayCount = 15, ForeignWorkdayCount = 5 }, // 预期英国应税金额:2250.00 GBP
        new Payment { TotalAmount = 1281.50m, UkWorkdayCount = 3, ForeignWorkdayCount = 18 }, // 预期英国应税金额:183.07 GBP
        new Payment { TotalAmount = 250m, UkWorkdayCount = 31, ForeignWorkdayCount = 0 }, // 预期英国应税金额:250.00 GBP
        new Payment { TotalAmount = 50.63m, UkWorkdayCount = 0, ForeignWorkdayCount = 4 }, // 预期英国应税金额:0.00 GBP

    };

    // 验证每个支付项
    foreach(var p in payments)
    {
        Validate(p);
    }

    var totalTaxableAmount = CalculateUkTaxableAmount(payments);

    // 将列表中每个项写入控制台
    payments.ForEach(payments =>
    Console.WriteLine(string.Format("Total UK taxable amount is: {0} GBP",
        totalTaxableAmount.ToString("F", CultureInfo.InvariantCulture))));
}

问题原因

  1. 计算方法提前返回:CalculateUkTaxableAmount方法在foreach循环的第一次迭代中就执行了return totalTaxableAmount;,导致方法直接返回第一个Payment项的计算结果,后续项完全未被处理。
  2. 输出逻辑错误:即使计算方法修复,原输出代码中payments.ForEach循环始终使用同一个totalTaxableAmount变量,没有为每个Payment项单独计算对应的值。

解决方案

步骤1:修改计算方法,支持单个Payment项计算

将原方法改为接收单个Payment参数,计算该项目的应税金额,同时处理总工作日为0的异常情况:

public static decimal CalculateUkTaxableAmount(Payment payment)
{
    var totalAmount = payment.TotalAmount;
    var ukWorkdayCount = payment.UkWorkdayCount;
    var foreignWorkdayCount = payment.ForeignWorkdayCount;

    // 避免除以0异常
    if (ukWorkdayCount + foreignWorkdayCount == 0)
    {
        return 0;
    }

    decimal ukWorkdayDecimal = ukWorkdayCount;
    decimal foreignWorkdayDecimal = foreignWorkdayCount;

    return totalAmount * (ukWorkdayDecimal / (ukWorkdayDecimal + foreignWorkdayDecimal));
}

步骤2:修改输出逻辑,为每个项单独计算并打印

在Main方法中,遍历每个Payment项时调用修改后的计算方法:

// 将列表中每个项写入控制台
payments.ForEach(payment =>
{
    var taxableAmount = CalculateUkTaxableAmount(payment);
    Console.WriteLine(string.Format("Total UK taxable amount is: {0} GBP",
        taxableAmount.ToString("F", CultureInfo.InvariantCulture)));
});

可选:批量计算总应税金额(如果需要)

如果需要统计所有Payment项的总应税金额,可额外添加以下方法:

public static decimal CalculateTotalUkTaxableAmount(List<Payment> payments)
{
    decimal total = 0;
    foreach (var payment in payments)
    {
        total += CalculateUkTaxableAmount(payment);
    }
    return total;
}

验证结果

修改后运行代码,将得到预期输出:

  • Total UK taxable amount is: 2250.00 GBP
  • Total UK taxable amount is: 183.07 GBP
  • Total UK taxable amount is: 250.00 GBP
  • Total UK taxable amount is: 0.00 GBP

内容的提问来源于stack exchange,提问作者Jared Mackay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:35:00