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
相关产品推荐
相关产品推荐

