简体   繁体   English

查找匹配类别名称的总数

[英]find total of matching category names

I have a xml file whose data looks something like this 我有一个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>

Here is the class I have to store this information 这是我必须存储此信息的课程

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;
    }

Right now I've been able to find total sales for a company, but I don't know how to find total sales for same categories. 现在,我已经能够找到一家公司的总销售额,但是我不知道如何找到相同类别的总销售额。 Here is sample code of what i've done 这是我所做的示例代码

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();
        }
    }

How do i display the total for matching categories? 如何显示匹配类别的总数?

Try this, group sales by category and then calculate the total amount for each category. 尝试此操作,按类别对销售进行分组,然后计算每个类别的总金额。

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()));
}   

What about this: 那这个呢:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM