如何使用 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?在DepositDiscount 的设置器中执行此操作,或将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 在列表中的类中添加两个字段?的主要内容,如果未能解决你的问题,请参考以下文章

两个List属性,无法使用LINQ创建列表

Flash as3 将一个类中的方法调用到另一个放在舞台上的类。

我可以在用于SQLite的类中使用String列表吗?

已安装LINQ2SQL,但类库项目中的“添加新项”列表中缺少LINQ To SQL类

如何在使用 prettier 的类中的方法声明前后添加新行?

python中的类中属性元素加self.和不加self.的区别