为了账号安全,请及时绑定邮箱和手机立即绑定

不确定如何正确地将数据提取到包含 string、int 和 double 属性的类列表中

不确定如何正确地将数据提取到包含 string、int 和 double 属性的类列表中

C#
偶然的你 2023-08-20 14:21:26
我正在使用 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 purchasedelse{  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 具有名称、日期列表以及与每一天相对应的每日利润列表。这样,商品列表中的每个商品都将具有唯一的品牌名称,因为它将适用于每次购买,而不是仅适用于购买该品牌商品的日期。我觉得我把事情变得过于复杂了,我主要担心的是,如果一个品牌一天有 0 次购买,我可能会得到一个大小为 5 的天数列表,以及一个大小为 的购买列表4、我需要它们的尺寸相同。感谢您的帮助,并感谢您花时间阅读我的问题。
查看完整描述

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使用像上面这样的外连接...这样您就会有一个行代表品牌/天的每个组合,即使某个品牌从未在特定日期销售过。


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信