如何从集合的foreach循环返回值?

时间:2017-05-29 13:09:15

标签: c# entity-framework asp.net-mvc-5

我有两个班级InvoiceInvoiceProductsInvoiceProducts是一个集合,并且只有一个名为Price的get属性,我希望Invoice拥有一个名为TotalPrice的属性,该属性将返回Price foreach项目添加了InvoiceProducts个集合。但是,我不确定是否会这样做。按照目前的方式,我试图使用它,我得到一个错误说

  

"对象引用未设置为对象的实例。"有没有办法做到这一点?

目前的方式:

public class Invoice
{
    public int InvoiceID { get; set; }
    public string ClientName { get; set; }
    public DateTime Date { get; set; } = DateTime.Today;
    private decimal totalPrice;
    public decimal TotalPrice {
        get
        {
            return totalPrice;
        }
        set
        {
            foreach(var item in InvoiceProducts)
            {
                totalPrice += item.Price;
            }
        }
    }

    public virtual ICollection<InvoiceProducts> InvoiceProducts { get; set; }
}

public class InvoiceProducts
{
    public int InvoiceProductsID { get; set; }
    public int InvoiceID { get; set; }
    public int ProductID { get; set; }
    public int ProductQuantity { get; set; }
    public decimal Price { get { return Product.ProductPrice * ProductQuantity; } }

    public virtual Invoice Invoice { get; set; }
    public virtual Product Product { get; set; }
}

2 个答案:

答案 0 :(得分:3)

public decimal TotalPrice {
    get
    {
        return InvoiceProducts.Sum(product => product.Price);
    }
}

或更短,因为它只得到:

public decimal TotalPrice => InvoiceProducts.Sum(product => product.Price);

当然,您需要初始化您的产品列表,并且可能仅限于此。

public Invoice() 
{
    InvoiceProducts = new List<InvoiceProcuct>();
}

public ICollection<InvoiceProduct> InvoiceProducts { get; }

答案 1 :(得分:0)

我看到这已经回答了,但我想提供一些额外的说明,如果我可以尝试的话。 set接受参数,并且是您根据要为其分配属性时分配属性值时要运行的特殊逻辑。举一个简单的例子:

  public class SpecialNumber
    {
        private double _theNumber; 

        public double TheNumber
        {
            get { return _theNumber; }
            set
            {
                _theNumber = value * Math.PI;
            }
        }
    }

保留字value是表达式的右侧:

specialNumberObject.TheNumber = 5.0;

因此,setter内的值将为5.0。 S. Spindler指出你在setter中的逻辑非常适合get,因为它定义了一个自定义返回,只要我们想访问你就想要执行属性的值。

我的类的另一个版本可能决定在出路时有一个乘以PI的属性,如果我班级的后端逻辑依赖于数字,那么这可能很有用。未经形成的形式。在这种情况下,逻辑更适合吸气剂。

我希望我没有把这个问题搞糊涂。