using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace PlayingWithWinForms { public partial class Form1 : Form { public Form1( ) { InitializeComponent( ); ICheckBoxGroup< ISport > group = new CheckBoxGroup< ISport >( ); group.Add( checkBox1, Sport.Hockey ); group.Add( checkBox2, Sport.BasketBall ); group.Add( checkBox3, Sport.FootBall ); group.Add( checkBox4, Sport.Golf ); group.Add( checkBox5, Sport.Tennis ); button1.Click += delegate { StringBuilder builder = new StringBuilder( ); foreach ( ISport employee in group.GetAllEnabled( ) ) { builder.AppendFormat( "{0}{1}", employee, Environment.NewLine ); } MessageBox.Show( builder.ToString( ) ); }; } } internal interface ICheckBoxGroup< T > { void Add( CheckBox checkbox, T item ); IEnumerable< T > GetAllEnabled( ); IEnumerable< T > GetAllThatSatisfies( Predicate< CheckBox > condition ); } public class CheckBoxGroup< T > : ICheckBoxGroup< T > { public CheckBoxGroup( ) { _checkboxes = new List< CheckBox >( ); } public void Add( CheckBox checkbox, T item ) { checkbox.Tag = item; checkbox.Text = item.ToString( ); _checkboxes.Add( checkbox ); } public IEnumerable< T > GetAllEnabled( ) { return GetAllThatSatisfies( delegate( CheckBox box ) { return box.Checked; } ); } public IEnumerable< T > GetAllThatSatisfies( Predicate< CheckBox > condition ) { foreach ( CheckBox checkBox in _checkboxes ) { if ( condition( checkBox ) ) { yield return ( T )checkBox.Tag; } } } private readonly IList< CheckBox > _checkboxes; } public class Sport : ISport { private Sport( string name ) { _name = name; } public static readonly ISport Hockey = new Sport( "Hockey" ); public static readonly ISport BasketBall = new Sport( "Basket Ball" ); public static readonly ISport FootBall = new Sport( "Football" ); public static readonly ISport Golf = new Sport( "Golf" ); public static readonly ISport Tennis = new Sport( "Tennis" ); public string Name { get { return _name; } } public override string ToString( ) { return Name; } private readonly string _name; } public interface ISport { string Name { get; } } }