CSharp · Console
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
var things = GetThings();
//The original S/O answer
var stackFlowAnswer = things
.Select(p => new { ThingId = p.ID, Age = DateTime.Now.Year - p.YearBuilt })
.GroupBy(p => p.Age > 65 ? 5 : (int)((p.Age - 16) / 10))
.Select(g => new {
AgeGroup = g.Key == 5 ? "> 65" : string.Format("{0} - {1}",
g.Key * 10 + 16,
g.Key * 10 + 25),
Count = g.Count() });
//my attempt to increase the numbner of bucets and start from zero.
var thingsByAge = things
.Select(p => new { ThingId = p.ID, Age = DateTime.Now.Year - p.YearBuilt })
.GroupBy(p => p.Age > 40 ? 8 : (int)((p.Age + 1) / 5))
.Select(g => new {
AgeGroup = g.Key == 8 ? "> 40" : string.Format("{0} - {1}", //"g.Key == 7" puts that group at index 7 (the last one)
g.Key,
g.Key * 5 + 4,
g.Key * 5 + 9,
g.Key * 5 + 14,
g.Key * 5 + 19,
g.Key * 5 + 24,
g.Key * 5 + 29,
g.Key * 5 + 34,
g.Key * 5 + 39),
Count = g.Count() }
);
var json = Newtonsoft.Json.JsonConvert.SerializeObject(thingsByAge, Newtonsoft.Json.Formatting.Indented);
//var json = Newtonsoft.Json.JsonConvert.SerializeObject(stackFlowAnswer, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(json);
}
public static List<Thing> GetThings()
{
var things = new List<Thing>();
things.AddRange(MakeThings(2, 2019)); things.AddRange(MakeThings(12, 2018)); things.AddRange(MakeThings(2, 2017)); things.AddRange(MakeThings(0, 2016)); things.AddRange(MakeThings(0, 2016));
things.AddRange(MakeThings(7, 2015)); things.AddRange(MakeThings(8, 2014)); things.AddRange(MakeThings(15, 2013)); things.AddRange(MakeThings(5, 2012)); things.AddRange(MakeThings(5, 2011));
things.AddRange(MakeThings(0, 2010)); things.AddRange(MakeThings(0, 2009)); things.AddRange(MakeThings(0, 2008)); things.AddRange(MakeThings(0, 2007)); things.AddRange(MakeThings(0, 2006));
things.AddRange(MakeThings(9, 2005)); things.AddRange(MakeThings(4, 2004)); things.AddRange(MakeThings(5, 2003)); things.AddRange(MakeThings(5, 2002)); things.AddRange(MakeThings(5, 2001));
things.AddRange(MakeThings(1, 2000)); things.AddRange(MakeThings(5, 1999)); things.AddRange(MakeThings(5, 1998)); things.AddRange(MakeThings(5, 1997)); things.AddRange(MakeThings(5, 1996));
things.AddRange(MakeThings(1, 1995));
things.AddRange(MakeThings(1, 1990));
things.AddRange(MakeThings(1, 1985));
things.AddRange(MakeThings(1, 1980));
things.AddRange(MakeThings(1, 1975));
things.AddRange(MakeThings(1, 1970));
things.AddRange(MakeThings(1, 1965));
things.AddRange(MakeThings(1, 1960));
things.AddRange(MakeThings(1, 1955));
things.AddRange(MakeThings(1, 1950));
things.AddRange(MakeThings(1, 1945));
return things;
}
public static List<Thing> MakeThings(int count, int year)
{
var ret = new List<Thing>();
for(var i = 0; i < count; i++)
{
ret.Add(new Thing(year));
}
return ret;
}
public class Thing
{
public Thing(int yearBuilt)
{
this.ID = Guid.NewGuid().ToString();
this.YearBuilt = yearBuilt;
}
public string ID { get; set; }
public int YearBuilt { get; set; }
}
}