【问题标题】:find total of matching category names查找匹配类别名称的总数
【发布时间】:2013-10-31 07:28:19
【问题描述】:

我有一个 xml 文件,它的数据看起来像这样

<Companies>
  <Company>
     <Name>Company123</Name>
     <Sales>
       <Sale>
         <Code>Sale123</Code>
         <Category>Apple</Category>
         <Amount>150.50</Amount>
       </Sale>
       <Sale>
         <Code>Sale234</Code>
         <Category>Mango</Category>
         <Amount>170.50</Amount>
       </Sale>
       <Sale>
         <Code>Sale345</Code>
         <Category>Apple</Category>
         <Amount>160.50</Amount>
       </Sale>
     </Sales>
   </Company>
   <Company>
    //other values
   </Company>
</Companies>

这是我必须存储这些信息的类

public class Companies 
    {
        public Companies()
        {
            AllCompanies = new List<Company>();
        }

        public List<Company> AllCompanies;

    }
    public class Company
    {
        public Company()
        {
            Saleses = new List<Sales>();
        }

        public string Name;
        public string Code;
        public double MaintenancePercentage;
        public double AverageSales;
        public double TotalSales;
        public double TotalMaintenanceFee;
        public List<Sales> Saleses;

    }
    public class Sales
    {
        public string Code;
        public string Title;
        public DateTime DateTime;
        public string Category;
        public double Amount;
    }

现在我已经能够找到一家公司的总销售额,但我不知道如何找到相同类别的总销售额。 这是我所做的示例代码

var companies = (from c in doc.Descendants("Company")
                           select c).ToList();
            foreach (var xCompany in companies)
            {
                var sales = (from xElement in xCompany.Descendants("Sale") select xElement).ToList();

                var company = new Company()
                    {
                        Name = ((from x in xCompany.Descendants("Name") select x.Value).First()),
                        Code = (from x in xCompany.Descendants("Code") select x.Value).First(),
                        MaintenancePercentage =
                            Convert.ToDouble((from x in xCompany.Descendants("MaintenancePercentage") select x.Value).First())
                    };
                for (int index = 0; index < sales.Count; index++)
                {
                    var xElement = sales[index];
                    var sale = new Sales()
                        {
                            Code = ((from x in xElement.Descendants("Code") select x.Value).First()),
                            Title = ((from x in xElement.Descendants("Title") select x.Value).First()),
                            DateTime = Convert.ToDateTime((((from x in xElement.Descendants("Date") select x.Value).First()))),
                            Category = ((from x in xElement.Descendants("Category") select x.Value).First()),
                            Amount = Convert.ToDouble(((from x in xElement.Descendants("Amount") select x.Value).First()))
                        };
                    company.Saleses.Add(sale);
                }
                company.TotalSales = repository.GetTotalSales(company);
                company.AverageSales = repository.AverageSales(company);
                company.TotalMaintenanceFee = repository.MaintenanceFee(company);

                companiesList.AllCompanies.Add(company);


            }
            #endregion
            #region WriteData
            foreach (var xElement in companiesList.AllCompanies)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Company Name: " + xElement.Name);
                Console.ResetColor();
                Console.WriteLine("Company Code: "+xElement.Code);
                Console.WriteLine("Company Maintenance percentage: "+xElement.MaintenancePercentage);
                Console.WriteLine("Company Total sales: " + xElement.TotalSales);
                Console.WriteLine("Total maintenance fee: "+ xElement.TotalMaintenanceFee);
                Console.WriteLine("Company Average sales: " + xElement.AverageSales);
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine("Linked sales:");
                Console.ResetColor();
                foreach (var sale in xElement.Saleses)
                {
                    Console.WriteLine("Code: "+ sale.Code);
                    Console.WriteLine("Title: " + sale.Title);
                    Console.WriteLine("Date: " + sale.DateTime);
                    Console.WriteLine("Category: " + sale.Category);
                    Console.WriteLine("Amount: " + sale.Amount);
                }
                Console.WriteLine(" ");
            }
            #endregion
            Console.ReadLine();
        }
    }

如何显示匹配类别的总数?

【问题讨论】:

    标签: c# linq c#-4.0 for-loop foreach


    【解决方案1】:

    这个呢:

    string iceCreamCategory = "IceCream";
    double iceCreamTotal = company.Saleses
        .Where(sale => sale.Category == iceCreamCategory)
        .Sum(sale => sale.Amount);
    

    【讨论】:

    • 听起来很棒,但在这里你知道类别的名称,但在我的实际 xml 文件中,我必须以某种方式存储不同类别名称的名称,并检查类别名称是否与包含不同类别的变量匹配名称,如果名称匹配,则添加。那怎么办?
    • 哦,好的。我以为你只是在寻找一个特定的类别。在这种情况下,埃斯特班的回答应该做你想做的。
    【解决方案2】:

    试试这个,按类别对销售额进行分组,然后计算每个类别的总金额。

    var categoryTotals = company.Saleses
                .GroupBy (c => c.Category)
                .Select (
                   g => 
                      new  
                      {
                         Category = g.Key, 
                         Total = g.Sum(s => s.Amount)
                      }
                );
    
    foreach(var categoryTotal in categoryTotals)
    {
         Console.WriteLine(string.Format("Category: {0}, Total: {1}", 
             categoryTotal.Category, categoryTotal.Total.ToString()));
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2016-08-01
      相关资源
      最近更新 更多