using System.Collections.Generic;
public static void Main()
var pepperoni = new List<string>()
var meat = new List<string>()
var boring = new List<string>()
var pizzas = new List<Pizza>()
{new Pizza{Name = "Pepperoni Feast", Toppings = new[]{"pepperoni"}}, new Pizza{Name = "Meat Feast", Toppings = meat}, new Pizza{Name = "Boring", Toppings = boring}, new Pizza{Name = "Pepperoni Feast", Toppings = new List<string>{"pepperoni"}}};
var groupedPizzas = pizzas.GroupBy(e => e.Toppings, new ToppingComparer()).Select(e => new
Toppings = e.Key, Count = e.Count()}
).OrderByDescending(e => e.Count).Take(20);
foreach (var pizza in groupedPizzas)
Console.WriteLine(string.Format("{0}: {1}", string.Join(", ", pizza.Toppings), pizza.Count));
public class ToppingComparer : IEqualityComparer<IEnumerable<string>>
public bool Equals(IEnumerable<string> x, IEnumerable<string> y)
return x.SequenceEqual(y);
public int GetHashCode(IEnumerable<string> obj)
foreach (var word in obj)
hash += word.GetHashCode();
public IEnumerable<string> Toppings