计算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()
!)
按照我的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;
}
答案 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)
我掌握的是:
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;
}