Split one list into many by month - C#, Linq
c#, linq, list, median
Solution
You can use `GroupBy` to group the list into groups by month. For example, the following will group by Month (month+year, actually) and then write out to the console all values per month:
var grouped = monthlySales.GroupBy(ms => string.Format("{0}-{1}", ms.Month, ms.Year));
foreach(var group in grouped)
{
Console.WriteLine("Values in month-year of {0}:", group.Key);
foreach(var ms in group)
Console.WriteLine(" {0}", ms.USDRevenueTotal);
}
Problem
I have the following Linq query: ``` List<MonthlySales> monthlySales = (from sale in Sales group sale by new { sale.DateSold.Month, sale.Product.Shop } into ds select new MonthlyTitleSales { Shop = ds.Select(it => it.Product.Shop).FirstOrDefault(), Month = ds.Select(it => it.DateSold.Month).FirstOrDefault(), Year = ds.Select(it => it.DateSold.Year).FirstOrDefault(), USDNumberItemsSold = ds.Where(it => it.USDCut.HasValue).Where(it => it.USDCut != 0).Count(), GBPNumberItemsSold = ds.Where(it => it.GBPCut.HasValue).Where(it => it.GBPCut != 0).Count(), EURNumberItemsSold = ds.Where(it => it.EURCut.HasValue).Where(it => it.EURCut != 0).Count(), USDRevenueTotal = PerformCurrencyConversion(ds.Sum(it => it.USDCut.HasValue ? it.USDCut.Value : 0), 0M, 0M, Currency, endDate), GBPRevenueTotal = PerformCurrencyConversion(0M, ds.Sum(it => it.GBPCut.HasValue ? it.GBPCut.Value : 0), 0M, Currency, endDate), EURRevenueTotal = PerformCurrencyConversion(0M, 0M, ds.Sum(it => it.EURCut.HasValue ? it.EURCut.Value : 0), Currency, endDate), }).OrderBy(it => it.DateSold.Month).ToList(); ``` This query gives me a list with the following elements in each list item: Shop, Month, Year, Revenue Made What I ultimately need to do is calculate the median of the revenue for all the shops for each month, so I need to get the data ready in such a way that will allow me to do that. I thought one way might be to break this list into small lists by month but I have my doubts that this is the most efficient solution. Has anyone any thoughts on this? Monthly Sales class for anyone who needs to see: ``` public class MonthlySales { public int Month { get; set; } public int Year { get; set; } public Shop Shop { get; set; } public int USDNumberItemsSold { get; set; } public int GBPNumberItemsSold { get; set; } public int EURNumberItemsSold { get; set; } public int TotalNumberItemsSold { get { return USDNumberItemsSold + GBPNumberItemsSold + EURNumberItemsSold; } } public decimal USDRevenueTotal { get; set; } public decimal GBPRevenueTotal { get; set; } public decimal EURRevenueTotal { get; set; } public decimal OverallEarnings { get { return USDRevenueTotal + GBPRevenueTotal + EURRevenueTotal; } } } ```