如何计算List <t>中每种产品的最终价格?</t>

时间:2013-08-05 19:57:15

标签: c# asp.net-mvc-4

目标

计算C#List<T>内每种产品的最终价格。

问题

我需要计算一个简单产品的price * quantity并将结果返回给视图。

看一下这个语法:

var productPrice = productsPrices.Find(x => x.productId == 1); 
productPrice.finalProductPrice = 
    (productPrice.promotionalProductPrice != 0 ? 
        productPrice.promotionalProductPrice : 
        productPrice.originalProductPrice) 
    * sessionProducts.Find(x => x.id == 1).quantity;

在上面传递的代码片段之前,有一个存储产品ID的字符串,请参阅:

string ids = string.Join(", ", sessionProducts.Select(x => x.id));

我认为我需要将其设置为finalProductPrice列表中每个产品的productsPrices值,但我不知道如何执行此操作。

我对这个主题的看法:

我以为我可以使用这样的东西:

productsPrices.Find(x => x.productId == productsPrices.Contains(ids))
    .finalProductPrice = 
    (productsPrices.Find(x => productsPrices.Contains(ids))
        .promotionalProductPrice != 0 ?
    productsPrices.Find(x => productsPrices.Contains(ids))
        .promotionalProductPrice : 
    productsPrices.Find(x => productsPrices.Contains(ids))
        .originalProductPrice) *
    sessionProducts.Find(x => x.id == 1).quantity;

但是,当然,没有成功 - .Contains()不适用于字符串。

我的真实的问题

如何为finalProductPrice列表中的每个产品定义正确的productsPrices?如何将string ids [...]中的每个ID传递给x.productId == something

欢迎提示(例如不要使用.Find(),而是使用.Select()!)

Spotlight代码

按照我的ActionResult将所有必要信息发送到我的视图中:

Compare.cs

public ActionResult Compare()
{
    List<getMarkets_Result> markets = Markets.Build();

    SessionStore sessionStore = new SessionStore();
    List<getSpecificProductToShoppingList_Result> sessionProducts = 
        sessionStore.Get("ProductsSummary", "generic");

    string ids = string.Join(", ", sessionProducts.Select(x => x.id));
    List<getProductsPrices_Result> productsPrices = Products.PricesList(ids);

    ListComparisonViewModel listComparisonViewModel = 
       new ListComparisonViewModel
    {
        Markets = markets,
        SessionProducts = sessionStore.Get("ProductsSummary", "generic"),
        ProductsPrices = productsPrices
    };

    return View(listComparisonViewModel);
}

如有必要,我的productsPrice列表的上下文:

public partial class getProductsPrices_Result
{
    public decimal originalProductPrice { get; set; }
    public decimal promotionalProductPrice { get; set; }
    public decimal finalProductPrice { get; set; }
    public string productName { get; set; }
    public string marketName { get; set; }
    public int productId { get; set; }
    public int marketId { get; set; }
}

我制作了一个名为产品(.cs)的模型来执行产品背后的逻辑。此模型的第一个(也是单个)方法是CalculateFinalPrice()

public decimal CalculateProductPriceByQuantity(decimal price, int quantity)
{
    return price * quantity;
}

4 个答案:

答案 0 :(得分:1)

我认为您应该以简化方式创建一个代表您的数据的模型,以便更轻松地解决您的业务问题。换句话说,让代码解决您的问题。

首先,产品不应该知道数量。假设它像推车一样工作,产品应该只知道自己。因此,finalProductPrice的实施应该更加容易:

public decimal finalProductPrice 
{
    get 
    {
        return (promotionalProductPrice != 0 ? 
            promotionalProductPrice : 
            originalProductPrice);
    }
}

使用您的产品时,请创建一个类并将其包含在其中以计算质量和总价格:

public class ProductCollection
{
    public IEnumerable<getProductsPrices_Result> Products { get; set; }
    public int Quantity { get { return Products.Count; } }
    public decimal TotalPrice 
    {
        get
        {
            return Products.Sum(p => p.finalProductPrice );
        }
    }
    public ProductCollection(IEnumerable<getProductsPrices_Result> products)
    {
        this.Products = products;
    }
}

现在你的viewmodel看起来像这样:

ListComparisonViewModel
{
    Markets = markets,
    Products = new ProductCollection(sessionStore.Get("ProductsSummary", "generic"))
};

我想在这里做一个重要的注意事项,这有助于减少会话访问表面积。会话可以“被任何人访问”,因此可能会变得混乱并导致很多问题。在几乎所有情况下,会话cookie罐中的手越少越好。 (更少的键以及更少的类类型和实例)

答案 1 :(得分:0)

你在这里遇到很多问题。首先,你的属性应该是PascalCase,而不是camelCase。其次,你的班级命名不佳。 getProductsPrices_Result不应该以动词作为前缀,它应该是没有下划线的PascalCase。

除此之外,你还有很多冗余代码。 FinalProductPrice听起来不像Product类型的适当属性。

要回答有关获取与ID集合匹配的产品集合的问题,您可以使用LINQ:

string[] ids = ...;
List<Product> products = ...;

List<Product> matchingProducts = 
    products.Where(p => ids.Any(i => i == p.Id)).ToList();

答案 2 :(得分:0)

问题有点模糊,但看起来你可能正在寻找类似下面的内容

var res = (from p in products
           from s in sessionproducts
           where p.id == s.id
           select new Product() { id = p.id, finalprice = s.qty * (p.promoprice > 0 ? p.promoprice : p.price) })
           .ToList();

答案 3 :(得分:0)

  • 我会仔细检查你的班级设计。
  • 我会制作促销价 如果促销需要价格= 0,该怎么办?
  • 考虑将此方法作为会话中产品引用集合的扩展方法。

我掌握的是:

foreach(var product in sessionProducts){        
    var productPrice == productPrices.FirstOrDefault(p=>p.ProductId == product.id);
    var price = 0;
    if (productPrice != null)
       price = productPrice.promotionalPrice == 0 ? productPrice.originalPrice : productPrice.promotionalPrice;

    product.finalPrice = product.Qty * price;
}