我正在与asp.net MVC合作,试图制作一个表格来显示品牌每天在几天内的总利润,我正在努力解决如何将品牌净利润为0的天数包括在内。
当我在名为purchaseQuery的变量中查询商店在给定时间范围内的购买总数后,它将给我品牌名称、购买日期(作为一个整数)、该商品的价格以及在该交易中购买的商品的金额。假设每个品牌只销售一种产品,并且该产品的价格每天都在波动。此代码位于该查询之后。
purchasedItems = new List<BrandsTransactionItem>();
foreach (var query in purchaseQuery)
{
BrandsTransactionItem tempItem;
tempItem = purchasedItems.Where(e => e.day == query.day).Where(e => e.brandName == query.brandName).FirstOrDefault();
//If item not in list already,
if (tempItem == null)
{
purchasedItems.Add(new BrandsTransactionItem()
{
brandName = query.brandName,
day = query.day,
totalPurchased = query.TotalPurchased,
costOfItem = query.costOfItem
});
}
// if it already exists, just add to amount purchased
else
{
tempItem.totalPurchased += query.totalPurchased;
}
}
foreach (var item in purchasedItems)
{
double dailyProfit = (double)(item.totalPurchased * item.costOfItem);
dailyProfit = Math.Round(dailyProfit, 2); // make it decimal of 2
// Items is the list that I want to display in MVC
Items.Add(new BrandsProfit(){
brandName = item.brandName,
day = item.day,
totalDailyProfit = dailyProfit
});
}我想要转换,这样BrandsProfit就会有一个名称,一个日期列表,以及一个与这些日期对应的dailyProfits列表。这样,项目列表中的每个项目都将具有唯一的品牌名称,因为它将应用于每一次购买,而不是仅在购买品牌项目的天数内应用。
我觉得我已经把事情复杂化了,我主要担心的是,如果一个品牌一天有0个购买,我可能会有一个大小为5的天数列表和一个大小为4的购买列表,我需要它们的大小相同。
感谢您的帮助,感谢您抽出时间阅读我的问题。
发布于 2019-08-09 11:34:26
这类问题是使用LINQ的一个很好的选择。
下面的LINQ查询首先创建不同日期和品牌名称的外连接。这给了我们一个列表,列出了我们可以加入的所有天的所有品牌。这样,每个品牌都将拥有相同的天数,即使它从未在特定的一天售出任何商品。
然后,它根据该品牌/天数列表加入购买,如果当天没有记录该品牌的购买,则使用DefaultIfEmpty创建零成本/数量的替代购买。
然后,该联接的结果被投影到BrandsProfit对象列表中。
例如,如果某个品牌在某一天没有购买,您会注意到,在样本数据列表中,"2“天的品牌"B”被注释掉了;但在结果中,"2“天的品牌"B”仍然有一行,TotalDailyProfit为0。
void Main()
{
var purchases = new List<Purchase>() {
new Purchase() { BrandName = "A", CostOfItem = 1.13M, Day = 1, TotalPurchased = 125 },
new Purchase() { BrandName = "B", CostOfItem = 1.52M, Day = 1, TotalPurchased = 165 },
new Purchase() { BrandName = "C", CostOfItem = 1.90M, Day = 1, TotalPurchased = 836 },
new Purchase() { BrandName = "A", CostOfItem = 1.74M, Day = 2, TotalPurchased = 583 },
//new Purchase() { BrandName = "B", CostOfItem = 1.52M, Day = 2, TotalPurchased = 785 },
new Purchase() { BrandName = "C", CostOfItem = 1.42M, Day = 2, TotalPurchased = 369 },
new Purchase() { BrandName = "A", CostOfItem = 1.93M, Day = 3, TotalPurchased = 789 },
new Purchase() { BrandName = "B", CostOfItem = 1.87M, Day = 3, TotalPurchased = 739 },
new Purchase() { BrandName = "C", CostOfItem = 1.78M, Day = 3, TotalPurchased = 436 },
};
var results = from day in purchases.Select(x => x.Day).Distinct()
from brand in purchases.Select(x => x.BrandName).Distinct()
join purchase in purchases on new { Brand = brand, Day = day } equals new { Brand = purchase.BrandName, Day = purchase.Day } into j
from result in j.DefaultIfEmpty(new Purchase() { BrandName = brand, Day = day, TotalPurchased = 0, CostOfItem = 0 })
select new BrandsProfit()
{
BrandName = result.BrandName,
Day = result.Day,
TotalDailyProfit = result.TotalPurchased * result.CostOfItem
};
Debug.WriteLine(JsonConvert.SerializeObject(results, Newtonsoft.Json.Formatting.Indented));
}
class Purchase
{
public string BrandName { get; set; }
public int Day { get; set; }
public int TotalPurchased { get; set; }
public decimal CostOfItem { get; set; }
}
class BrandsProfit
{
public string BrandName { get; set; }
public int Day { get; set; }
public decimal TotalDailyProfit { get; set; }
}产生以下结果:-
[
{
"BrandName": "A",
"Day": 1,
"TotalDailyProfit": 141.25
},
{
"BrandName": "B",
"Day": 1,
"TotalDailyProfit": 250.80
},
{
"BrandName": "C",
"Day": 1,
"TotalDailyProfit": 1588.40
},
{
"BrandName": "A",
"Day": 2,
"TotalDailyProfit": 1014.42
},
{
"BrandName": "B",
"Day": 2,
"TotalDailyProfit": 0.0
},
{
"BrandName": "C",
"Day": 2,
"TotalDailyProfit": 523.98
},
{
"BrandName": "A",
"Day": 3,
"TotalDailyProfit": 1522.77
},
{
"BrandName": "B",
"Day": 3,
"TotalDailyProfit": 1381.93
},
{
"BrandName": "C",
"Day": 3,
"TotalDailyProfit": 776.08
}
]如果您不想继续使用上面的示例,可以考虑将用于在purchaseQuery中生成数据的源查询更新为使用类似上面的外连接...这样,即使某个品牌从未在特定的一天售出,您也会为每个品牌/天的组合安排一行。
https://stackoverflow.com/questions/57421068
复制相似问题