如何创建Lookup <string,delegate =“”>集合

时间:2015-12-14 10:05:13

标签: .net collections delegates

我需要能够基于密钥过滤集合中的一组委托。每个密钥都有一个或多个与之关联的代理。看起来Lookup<TKey, TElement>可以在这里提供帮助,但我不确定是否可以创建一个TKey不是来自TElement属性的地方(在我的情况下,TElement将是委托类型,并且不会知道有关标识符的任何信息。)

更新

例如,如果我使用了Dictionary,我可以索引并过滤我的代理列表,如下例所示:

private delegate MyMethod MethodName(string key);

IDictionary<string, MyMethod> methodList = new Dictionary<string, MyMethod>();
methodList.Add("Key1", Method1);
methodList.Add("Key1", Method2);
methodList.Add("Key2", Method3);
methodList.Add("Key3", Method4);
methodList.Add("Key3", Method5);

var someMethods = methodlist["Key3"];

但是,这会失败,因为Dictionary需要一个唯一的密钥,而在我的方案中,每个密钥有多个条目。 Lookup支持每个键有多个条目,但无法使用Add方法对其进行实例化。我正在寻找一种实例化Lookup的方法,以便使用任意键索引委托列表。

有人可以提出这样做​​的方法吗?

1 个答案:

答案 0 :(得分:0)

I found a solution to this by wrapping the delegate in a class that also incorporates the key:

private delegate MyMethod DoStuff();

private class MethodWrapper
{
    public MethodWrapper(string key, MyMethod method)
    {
        Key = key;
        Method = method;
    }
    public string Key { get; private set; }
    public MyMethod Method { get; private set; }
}

Then you can produce a lookup like this:

private static IEnumerable<GetChart> GetMethodList(string key)
{
    IEnumerable<MethodWrapper> methods = new List<MethodWrapper>()
    {
        new MethodWrapper("Key1", Method1),
        new MethodWrapper("Key2", Method2),
        new MethodWrapper("Key2", Method3)
    };
    ILookup<string, GetChart> lookup = methods.ToLookup(m => m.Key, m => m.Method);

    return lookup[key];
}