internal void MoveTowardsMostDamagedZone() { var currentZone = (ZoneLocation?)CurrentZone; var zones = new [] { new { NewZone = currentZone, MoveCommand = new Action(() => { }) }, new { NewZone = currentZone.BluewardZoneLocation(), MoveCommand = new Action(MoveBlue) }, new { NewZone = currentZone.BluewardZoneLocation().BluewardZoneLocation(), MoveCommand = new Action(MoveBlue) }, new { NewZone = currentZone.RedwardZoneLocation(), MoveCommand = new Action(MoveRed) }, new { NewZone = currentZone.RedwardZoneLocation().RedwardZoneLocation(), MoveCommand = new Action(MoveRed) } } .Where(zone => zone.NewZone != null) .ToList(); var mostDamagedZoneGroup = zones .Select(zone => new { Zone = zone, DamageTaken = SittingDuck.GetDamageToZone(zone.NewZone.Value) }) .GroupBy(zone => zone.DamageTaken) .OrderByDescending(group => group.Key) .First(); if (mostDamagedZoneGroup.Count() == 1) { mostDamagedZoneGroup.Single().Zone.MoveCommand(); } else { zones.Single(zone => zone.NewZone.Value == ZoneLocation.White).MoveCommand(); } }