using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
var things = GetThings();
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))
AgeGroup = g.Key == 5 ? "> 65" : string.Format("{0} - {1}",
.Select(p => new { ThingId = p.ID, Age = DateTime.Now.Year - p.YearBuilt })
.GroupBy(p => p.Age > 40 ? 8 : (int)((p.Age + 1) / 5))
AgeGroup = g.Key == 8 ? "> 40" : string.Format("{0} - {1}",
var json = Newtonsoft.Json.JsonConvert.SerializeObject(thingsByAge, Newtonsoft.Json.Formatting.Indented);
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));
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));
public Thing(int yearBuilt)
this.ID = Guid.NewGuid().ToString();
this.YearBuilt = yearBuilt;
public string ID { get; set; }
public int YearBuilt { get; set; }