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

C# Linq新手求助:如何读取ObservableCollection字段计算总金额

现有代码问题点
  • Linq查询返回的是IEnumerable<T>集合类型,不能直接用Convert.ToInt32转换整个集合,无法得到有效计算值
  • PriceMenu是带越南盾千分符的格式化字符串,无法直接参与数值计算,需要先转回数值类型
  • 计算逻辑错误:没有遍历单条记录计算单条金额再累加,原代码强行转换集合后相乘的逻辑完全不符合需求
  • 构造函数中调用Sum()的时机错误:第一条数据插入时就调用全局求和方法,此时后两条数据还未插入集合,得到的结果自然不对

修复实现步骤

步骤1:给Utils类补充格式化字符串转回数值的方法

class Utils
{
     public static string ConvertMoney(string value)
     {
         CultureInfo cul = CultureInfo.GetCultureInfo("vi-VN");
         return double.Parse(value).ToString("#,###", cul.NumberFormat); 
     }
     
     // 新增:把格式化后的越南盾字符串转回数值
     public static double ConvertMoneyBack(string formattedValue)
     {
         CultureInfo cul = CultureInfo.GetCultureInfo("vi-VN");
         return double.Parse(formattedValue, NumberStyles.Currency, cul);
     }
}

步骤2:重写Sum总金额计算方法

使用Linq内置的Sum扩展方法,遍历每条记录计算单条金额后累加:

public double Sum()
{
    // 遍历集合中每一项,计算单条金额(数量*单价数值)后累加
    return cookviewmodel.Sum(item => item.Count * Utils.ConvertMoneyBack(item.PriceMenu));
}

步骤3:调整构造函数的调用逻辑

如果是计算所有记录的总金额,需要在所有数据插入完成后再调用Sum方法:

public CookViewModel()
{
    cookviewmodel = new ObservableCollection<CookModel>();
    // 插入数据时如果需要给单条的SumMoney赋值,直接计算当前条的金额即可,不要调用全局Sum
    cookviewmodel.Add(new CookModel { 
        Menu = "Bắp bò ngâm mắm nhĩ", 
        PriceMenu = Utils.ConvertMoney("1000000"), 
        Count = 2, 
        DoStatus = "Hoàn tất", 
        SumMoney = 2 * 1000000 // 单条自身的合计,也可以用Utils.ConvertMoneyBack转换后计算
    });
    cookviewmodel.Add(new CookModel { 
        Menu = "Bắp bò ngâm mắm nhĩ", 
        PriceMenu = Utils.ConvertMoney("1000000"), 
        Count = 1, 
        DoStatus = "Hoàn tất",
        SumMoney = 1 * 1000000
    });
    cookviewmodel.Add(new CookModel { 
        Menu = "Bắp bò ngâm mắm nhĩ", 
        PriceMenu = Utils.ConvertMoney("1000000"), 
        Count = 1, 
        DoStatus = "Hoàn tất",
        SumMoney = 1 * 1000000
    });

    // 所有数据插入完成后,再调用Sum计算全局总金额
    double totalAmount = Sum();
    // 可以把totalAmount赋值给对应的ViewModel属性展示
}

内容的提问来源于stack exchange,提问作者Harry Phan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:02