This seems like more fun:
Code:
class Program
{
static void Main(string[] args)
{
Dictionary<Type, Predicate<int>> swimmerTypes = new Dictionary<Type, Predicate<int>>();
swimmerTypes.Add(typeof(ChildSwimmer), new Predicate<int>(a => a < 16));
swimmerTypes.Add(typeof(SeniorSwimmer), new Predicate<int>(a => a > 65));
swimmerTypes.Add(typeof(AdultSwimmer), new Predicate<int>(a => a >= 16 && a <= 65));
List<Swimmer> swimmers = new List<Swimmer>();
int age;
do
{
Console.Write("Swimmer's age (-1 to end): ");
if (!int.TryParse(Console.ReadLine(), out age))
{
Console.WriteLine("Age must be an integer.");
}
else if (age != -1)
{
Type swimmerType = swimmerTypes.Keys.FirstOrDefault(type => swimmerTypes[type](age));
if (swimmerType == null)
{
Console.WriteLine("No swimmers meet that age criteria.");
}
else
{
Swimmer swimmer = (Swimmer)swimmerType.GetConstructor(new Type[] { }).Invoke(null);
swimmers.Add(swimmer);
}
}
} while (age != -1);
Console.WriteLine("");
IEnumerable<IGrouping<Type, Swimmer>> swimmerGroups = swimmers.GroupBy(s => s.GetType());
foreach(IGrouping<Type, Swimmer> group in swimmerGroups)
{
Swimmer swimmer = group.First();
Console.WriteLine("{0}: {1} x {2:0.00} = {3:0.00}", swimmer, group.Count(), swimmer.Cost, group.Count() * swimmer.Cost);
}
double totalCost = swimmers.Sum(s => s.Cost);
if (swimmers.Count > 6)
{
Console.WriteLine("\nYour group of {0} gets 20% off. That's a savings of {1:0.00}!", swimmers.Count, totalCost - totalCost * 0.8);
totalCost *= 0.8;
}
Console.WriteLine("\nYour total cost is: {0:0.0.0}", totalCost);
}
}
public abstract class Swimmer
{
public string Name { get; private set; }
public double Cost { get; private set; }
public Swimmer(string name, double cost)
{
Name = name;
Cost = cost;
}
public override string ToString()
{
return Name;
}
}
public class ChildSwimmer : Swimmer
{
public ChildSwimmer()
: base("Child", 2.5)
{
}
}
public class SeniorSwimmer : Swimmer
{
public SeniorSwimmer()
: base("Senior", 3.0)
{
}
}
public class AdultSwimmer : Swimmer
{
public AdultSwimmer()
: base("Adult", 5.0)
{
}
}
Code:
Swimmer's age (-1 to end): 37
Swimmer's age (-1 to end): 15
Swimmer's age (-1 to end): 8
Swimmer's age (-1 to end): 27
Swimmer's age (-1 to end): 52
Swimmer's age (-1 to end): 68
Swimmer's age (-1 to end): 22
Swimmer's age (-1 to end): -1
Adult: 4 x 5.00 = 20.00
Child: 2 x 2.50 = 5.00
Senior: 1 x 3.00 = 3.00
Your group of 7 gets 20% off. That's a savings of 5.60!
Your total cost is: 22.40