如何使用 LINQ 在列表中的类中添加两个字段?
Posted
技术标签:
【中文标题】如何使用 LINQ 在列表中的类中添加两个字段?【英文标题】:How to use LINQ to add two fields in a class that is in the List? 【发布时间】:2018-05-21 22:42:07 【问题描述】:我在这里查看了一些答案,但找不到我想要的。 所以,我决定发布这些问题:
我有一个 A 类的对象,我有一个 List<A>
。
类有如下定义:
public decimal Discount get; set;
public decimal Deposit get; set;
public decimal Total get; set;
我在列表中有很多这样的课程。
我计算了折扣和存款总额:
var DepositTotal = myList.Sum(x => x.Deposit);
var DiscountTotal = myList.Sum(x => x.Deposit);
现在,我需要计算每个班级的 Sum(Deposit,Discount) 并将结果分配给 Total
字段,以便稍后我可以为每个班级获得 Total
我该怎么做?
【问题讨论】:
“计算每个班级的总和(存款,折扣)”是什么意思?当您说“类”时,您的意思是 instance 吗?您的意思是对于每个实例,您要设置this.Total = this.Deposit + this.Discount
?在Deposit
和Discount
的设置器中执行此操作,或将Total
重写为public double Total => Discount + Deposit;
是的,这就是我现在正在做的事情。谢谢
我刚刚编辑了我的评论以提出完全不同的建议。
你想要listA.ForEach(d => d.Total = d.Deposit + d.Discount);
这样的东西吗?
【参考方案1】:
您真的不应该尝试修改 LINQ 查询中的项目,因为您的代码的读者不会期望它发生。
不幸的是,即使使用 Select,您也可以轻松做到这一点:
list.Select(x => x.Total = x.Discount + x.Deposit; return x;);
注意:更好的解决方案是使用计算属性Total
而不是字段:
public decimal Total => Discount + Deposit;
【讨论】:
这确实很不幸。 @EdPlunkett 在帖子中整合了您更新的评论(我在看到更新之前也这样做了:))【参考方案2】:您目前使用 Discount and Deposit 的 setter 的方式听起来是正确的,但您也应该将 Total 的 setter 设为私有。
您不能/不应该在查询中改变列表的 A 对象,但您可以通过使用原始列表上的查询输出覆盖列表来更新列表。不清楚您的 A 类的构造函数,但类似于以下内容:-
myList = myList.Select(a=>new A(Discount =a.Discount, Deposit=a.Deposit, Total=a.Discount+a.Deposit) ).ToList();
如果 Total 仅依赖于 Discount 和 Deposit 的值——正如命名似乎表明的那样,让它完全在你的类内部——封装——会更好。
【讨论】:
以上是关于如何使用 LINQ 在列表中的类中添加两个字段?的主要内容,如果未能解决你的问题,请参考以下文章
Flash as3 将一个类中的方法调用到另一个放在舞台上的类。
已安装LINQ2SQL,但类库项目中的“添加新项”列表中缺少LINQ To SQL类