如何在 LINQ 中计算折扣 [关闭]

Posted

技术标签:

【中文标题】如何在 LINQ 中计算折扣 [关闭]【英文标题】:How to Calculate a Discount In LINQ [closed] 【发布时间】: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; 为什么您将我的答案标记为正确并删除了它? 【参考方案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));

【讨论】:

以上是关于如何在 LINQ 中计算折扣 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 查询? [关闭]

如何在 Linq 中编写嵌套的 Sql 查询 [关闭]

如何在javascript中获得小数点后三位[关闭]

如何在 LINQ 中计算累积和?

如何使用 LINQ 从列表中选择各种长度的部分 [关闭]

如何计算 LINQ 中 DataTable 的列的总和(到数据集)?