找到匹配的类别名称的总数

时间:2013-10-22 12:17:40

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

我有一个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();
        }
    }

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这个怎么样:

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