如何在LINQ中计算折扣

本文关键字:计算 LINQ | 更新日期: 2023-09-27 18:26:53

嗨,我正在尝试通过这种方法获得总额

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));

如何在LINQ中计算折扣

首先,这段代码真的开始需要一个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();

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

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));

首先计算折扣,然后将其应用于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));