首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不确定如何正确地将数据提取到包含字符串、int和double属性的类的列表中

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

Stack Overflow用户
提问于 2019-08-09 05:51:09
回答 1查看 30关注 0票数 0

我正在与asp.net MVC合作,试图制作一个表格来显示品牌每天在几天内的总利润,我正在努力解决如何将品牌净利润为0的天数包括在内。

当我在名为purchaseQuery的变量中查询商店在给定时间范围内的购买总数后,它将给我品牌名称、购买日期(作为一个整数)、该商品的价格以及在该交易中购买的商品的金额。假设每个品牌只销售一种产品,并且该产品的价格每天都在波动。此代码位于该查询之后。

代码语言:javascript
复制
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的购买列表,我需要它们的大小相同。

感谢您的帮助,感谢您抽出时间阅读我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-09 11:34:26

这类问题是使用LINQ的一个很好的选择。

下面的LINQ查询首先创建不同日期和品牌名称的外连接。这给了我们一个列表,列出了我们可以加入的所有天的所有品牌。这样,每个品牌都将拥有相同的天数,即使它从未在特定的一天售出任何商品。

然后,它根据该品牌/天数列表加入购买,如果当天没有记录该品牌的购买,则使用DefaultIfEmpty创建零成本/数量的替代购买。

然后,该联接的结果被投影到BrandsProfit对象列表中。

例如,如果某个品牌在某一天没有购买,您会注意到,在样本数据列表中,"2“天的品牌"B”被注释掉了;但在结果中,"2“天的品牌"B”仍然有一行,TotalDailyProfit为0。

代码语言:javascript
复制
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; }
}

产生以下结果:-

代码语言:javascript
复制
[
  {
    "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中生成数据的源查询更新为使用类似上面的外连接...这样,即使某个品牌从未在特定的一天售出,您也会为每个品牌/天的组合安排一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57421068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档