如何在 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 表达式的范围,然后像在普通委托方法中一样添加多行。() => //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 中计算折扣 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章