属性获取器中LINQ查询的性能优化

时间:2018-09-28 13:25:35

标签: c# performance linq

因此,我有一个用于模拟商店中制造的Sale的类。 Sale类的List中的Payment。销售类始终具有一个名为PointsPaid的属性,该属性使用LINQ来查找以忠诚度积分支付的付款金额之和。这就是班级的样子。

public class Sale
{
    private List<Payment> Payments {get;set;}

    public decimal PointsPaid
    {
        get
        {
            return Payments.Where(p => p.PaymentType == PaymentType.Points)
                           .Sum(p => p.Amount) * LoyaltyRate
        }
    }
}

我的问题是:有没有一种方法可以为PointsPaid实现相同的功能,而不必每次我想获取金额时都执行LINQ查询。我从来不需要处理优化性能,但这是针对实际客户的。

每个Sale对象可能只有一个Payment,所以我也不确定是否会大量消耗性能。

1 个答案:

答案 0 :(得分:0)

您对此列表拥有完全控制权,无法从外部进行修改。因此,请提供添加或删除付款并在那里计算值的方法:

public class Sale
{
    private List<Payment> Payments {get;set;}       // initialize in constructor
    private decimal _sumPointsAmount;
    public decimal LoyaltyRate { get; private set; } // set via constructor

    public decimal PointsPaid => _sumPointsAmount * LoyaltyRate;

    public void AddPayment(Payment p)
    {
        Payments.Add(p);
        if (p.PaymentType == PaymentType.Points)
            _sumPointsAmount += p.Amount;
    }
    public bool RemovePayment(Payment p)
    {
        bool removed = Payments.Remove(p);
        if(removed && p.PaymentType == PaymentType.Points)
            _sumPointsAmount -= p.Amount;
        return removed;
    }
}