1 回答

TA貢獻1946條經驗 獲得超4個贊
此類問題非常適合使用 LINQ。
下面的 LINQ 查詢首先創建不同日期和品牌名稱的外連接。這為我們提供了全天可以加入的所有品牌的列表。這樣,每個品牌都會有相同的天數,即使它在某一天從未售出任何商品。
然后,它會根據該品牌/日期列表加入購買,如果當天沒有記錄該品牌的購買,則會使用 來創建零成本/數量的替代購買DefaultIfEmpty。
然后,該連接的結果將被投影到對象列表中BrandsProfit。
例如,如果某一天沒有購買某個品牌,您會注意到在示例數據列表中,“2”天的品牌“B”被注釋掉了;但在結果中,“2”天仍然存在品牌“B”的行,每日總利潤為零。
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使用像上面這樣的外連接...這樣您就會有一個行代表品牌/天的每個組合,即使某個品牌從未在特定日期銷售過。
- 1 回答
- 0 關注
- 144 瀏覽
添加回答
舉報