为什么第#39;t字典和TKey、TValue&>支持空键? [英] Why doesn't Dictionary<TKey, TValue> support null key?

查看:67
本文介绍了为什么第#39;t字典和TKey、TValue&>支持空键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,为什么Dictionary<TKey, TValue>不支持单个空键?

其次,现有的类似词典的集合是否有这样的功能?

我想存储"Empty"、"Missing"或"Default"System.Type,我认为null可以很好地完成此任务。


更具体地说,我编写了这个类:

class Switch
{
    private Dictionary<Type, Action<object>> _dict;

    public Switch(params KeyValuePair<Type, Action<object>>[] cases)
    {
        _dict = new Dictionary<Type, Action<object>>(cases.Length);
        foreach (var entry in cases)
            _dict.Add(entry.Key, entry.Value);
    }

    public void Execute(object obj)
    {
        var type = obj.GetType();
        if (_dict.ContainsKey(type))
            _dict[type](obj);
    }

    public static void Execute(object obj, params KeyValuePair<Type, Action<object>>[] cases)
    {
        var type = obj.GetType();

        foreach (var entry in cases)
        {
            if (entry.Key == null || type.IsAssignableFrom(entry.Key))
            {
                entry.Value(obj);
                break;
            }
        }
    }

    public static KeyValuePair<Type, Action<object>> Case<T>(Action action)
    {
        return new KeyValuePair<Type, Action<object>>(typeof(T), x => action());
    }

    public static KeyValuePair<Type, Action<object>> Case<T>(Action<T> action)
    {
        return new KeyValuePair<Type, Action<object>>(typeof(T), x => action((T)x));
    }

    public static KeyValuePair<Type, Action<object>> Default(Action action)
    {
        return new KeyValuePair<Type, Action<object>>(null, x => action());
    }
}

用于打开类型。有两种使用方式:

  1. 静态。只需调用Switch.Execute(yourObject, Switch.Case<YourType>(x => x.Action()))
  2. 预编译。创建开关,然后在以后与switchInstance.Execute(yourObject)
  3. 一起使用

效果很好当您尝试将默认案例添加到"预编译"版本时(空参数异常)。

推荐答案

我突然想到,您的最佳答案可能是跟踪是否定义了默认案例:

class Switch
{
    private Dictionary<Type, Action<object>> _dict;
    private Action<object> defaultCase;

    public Switch(params KeyValuePair<Type, Action<object>>[] cases)
    {
        _dict = new Dictionary<Type, Action<object>>(cases.Length);
        foreach (var entry in cases)
            if (entry.Key == null)
                defaultCase = entry.Value;
            else
                _dict.Add(entry.Key, entry.Value);
    }

    public void Execute(object obj)
    {
        var type = obj.GetType();
        if (_dict.ContainsKey(type))
            _dict[type](obj);
        else if (defaultCase != null)
            defaultCase(obj);
    }

...

班级的其余部分将保持不变。

这篇关于为什么第#39;t字典和TKey、TValue&>支持空键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆