Der er ikke noget galt med Dictionary ideen - den passer fint ind.
Men jeg tror at List er mere fleksibel, se flex loesningen nednfor:
using System;
using System.Collections.Generic;
using System.Linq;
namespace E
{
public delegate void D(string msg);
public class Standard
{
public event D ToDo;
public void Test()
{
ToDo("Standard");
}
}
public class Custom
{
public List<D> ToDo = new List<D>();
public void Test()
{
ToDo.ForEach(d => d("Custom"));
}
}
public class CustomWithFilter
{
private List<Tuple<string,D>> ToDo = new List<Tuple<string,D>>();
public void Add(string key, D d)
{
ToDo.Add(Tuple.Create(key, d));
}
public void Test(string filter)
{
ToDo.Where(t => t.Item1==filter).ToList().ForEach(t => t.Item2("Custom with filter"));
}
}
public class Map
{
private Dictionary<string,List<D>> ToDo = new Dictionary<string, List<D>>();
public void Add(string key, D d)
{
if(!ToDo.ContainsKey(key))
{
ToDo.Add(key, new List<D>());
}
ToDo[key].Add(d);
}
public void Test(string filter)
{
ToDo[filter].ForEach(t => t("Map"));
}
}
public class CustomWithFlexFilter
{
private List<Tuple<string,D>> ToDo = new List<Tuple<string,D>>();
public void Add(string key, D d)
{
ToDo.Add(Tuple.Create(key, d));
}
public void Test(Func<string,bool> f)
{
ToDo.Where(t => f(t.Item1)).ToList().ForEach(t => t.Item2("Custom with flex filter"));
}
}
public class Program
{
public static void Main(string[] args)
{
Standard std = new Standard();
std.ToDo += (msg) => Console.WriteLine("A: {0}", msg);
std.ToDo += (msg) => Console.WriteLine("B: {0}", msg);
std.Test();
Custom cust = new Custom();
cust.ToDo.Add((msg) => Console.WriteLine("A: {0}", msg));
cust.ToDo.Add((msg) => Console.WriteLine("B: {0}", msg));
cust.Test();
CustomWithFilter cwf = new CustomWithFilter();
cwf.Add("A", (msg) => Console.WriteLine("A: {0}", msg));
cwf.Add("B", (msg) => Console.WriteLine("B: {0}", msg));
cwf.Test("A");
cwf.Test("B");
Map m = new Map();
m.Add("A", (msg) => Console.WriteLine("A: {0}", msg));
m.Add("B", (msg) => Console.WriteLine("B: {0}", msg));
m.Test("A");
m.Test("B");
CustomWithFlexFilter cwff = new CustomWithFlexFilter();
cwff.Add("A", (msg) => Console.WriteLine("A: {0}", msg));
cwff.Add("B", (msg) => Console.WriteLine("B: {0}", msg));
cwff.Test(s => s.StartsWith("A"));
cwff.Test(s => s!="A");
Console.ReadKey();
}
}
}