【问题标题】:How to use LINQ to add two fields in a class that is in the List?如何使用 LINQ 在列表中的类中添加两个字段?
【发布时间】: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);这样的东西吗?

标签: c# linq linq-to-entities linq-to-objects


【解决方案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 的值——正如命名似乎表明的那样,让它完全在你的类内部——封装——会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2016-04-07
    • 2013-10-07
    • 2021-07-23
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多