【问题标题】:How to Calculate a Discount In LINQ [closed]如何在 LINQ 中计算折扣 [关闭]
【发布时间】:2015-12-15 09:53:56
【问题描述】:

您好,我正在尝试通过这种方法获取总金额

calculateDiscount = discount / 100  
Discounted price = Unitprice * calculateDiscount   
total amount = sum(Quantity * Discounted price)

折扣百分比来自控制txtdiscount

如何在下面的代码中实现它,谢谢

double total = gridpur.Rows.Cast<GridViewRow>()
    .Where(r => ((CheckBox)r.FindControl("chkSel")).Checked)
    .Sum(r => double.Parse(((TextBox)r.FindControl("txtQuantity")).Text) *
        double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text));

【问题讨论】:

  • 首先,您最好将输入字段的文本写入一些变量,以提高代码的可读性。此外:问题到底是什么?你得到的结果与你所执行的不同吗?如果有,你会得到什么?
  • @HimBromBeere 完全同意。您可以使用 {} 来确定 lambda 表达式的范围,然后像在普通委托方法中一样添加多行。() =&gt; {//some code;\r\n //some more code;\r\n return something;}
  • 为什么您将我的答案标记为正确并删除了它?

标签: c# asp.net linq


【解决方案1】:

首先,这段代码真的开始需要ViewModel 或其他可以让您将业务逻辑与 UI 分离的构造。

话虽如此,让您继续前进的快速而肮脏的答案是实现一个临时 linq 查询,然后从中构建您的结果

// From your code
var validRows = gridpur.Rows.Cast<GridViewRow>()
    .Where(r => ((CheckBox)r.FindControl("chkSel")).Checked);
var totals = validRows.Select((r => 
    double.Parse(((TextBox)r.FindControl("txtQuantity")).Text)
    * double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text));

如果我们从作为扩展方法的 linq 转移到作为集成查询语法的 linq 也会有所帮助,但可以随意混合和匹配

var validRows = from r in gridpur.Rows.Cast<GridViewRow>()
    where ((CheckBox)r.FindControl("chkSel")).Checked)
    select r;
var totals = from r in validRows
   select double.Parse(((TextBox)r.FindControl("txtQuantity")).Text)
    * double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text));

我们现在可以在查询中引入 let 语句和中间变量

var totals = from r in validRows
   let quantity = double.Parse(((TextBox)r.FindControl("txtQuantity")).Text)
   let unitPrice = double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text))
   select quantity * unitPrice;

这具有使查询更具可读性的主要好处。

现在我们可以添加其他列和计算

var totals = from r in validRows
   let quantity = double.Parse(((TextBox)r.FindControl("txtQuantity")).Text)
   let unitPrice = double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text))
   let discountPercent = double.Parse(((TextBox)r.FindControl("txtDiscount")).Text) / 100.0d
   select quantity * unitPrice * discountPercent;
 var sumTotals = totals.Sum();

【讨论】:

    【解决方案2】:

    我想你必须使用类似的东西

    calculateDiscount = discount / 100  
    double discounted = Unitprice * calculateDiscount   
    total amount = sum(Quantity * discounted)
    

    这里的问题是Discounted price 不是变量的有效名称。

    double total = gridpur.Rows.Cast<GridViewRow>()
        .Where(r => ((CheckBox)r.FindControl("chkSel")).Checked)
        .Sum(r => double.Parse(((TextBox)r.FindControl("txtQuantity")).Text) *
            double.Parse(((TextBox)r.FindControl("txtUnitprice")).Text));
    

    【讨论】:

      【解决方案3】:

      首先计算折扣,然后将其应用到 Sum 中,如下面的代码:

      double total = gridpur.Rows.Cast<GridViewRow>()
          .Select(r => Tuple.Create((CheckBox)r.FindControl("chkSel"), (TextBox)r.FindControl("txtQuantity"), (TextBox)r.FindControl("txtUnitprice"), (TextBox)r.FindControl("txtDiscount")))
          .Where(t => t.Item1.Checked)
          .Sum(r => double.Parse(t.Item2.Text) * double.Parse(t.Item3.Text) * double.Parse(t.Item4.Text));
      

      【讨论】:

        猜你喜欢
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多