数据字典+匿名委托模拟switch/case功能

基本思想每个case的选择值作为键,处理过程做成函数委托存放进数据字典。用的时候根据之调用。下面上代码

封装的FuncSwitcher类

using System;
using System.Collections.Generic;

namespace Test
{
    class FuncSwitcher<T>
    {
        int count;
        Dictionary<T, Delegate> FuncGather;
        Delegate defalutFunc;
        public FuncSwitcher()
        {
            count = 0;
            FuncGather = new Dictionary<T, Delegate>();
        }
        /// <summary>
        /// 调用函数处理
        /// </summary>
        /// <param name="t"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public object Invoke(T t, object[] parameters)
        {
            if (FuncGather.ContainsKey(t))
            {
                var method = FuncGather[t];
                return method.Method.Invoke(method, parameters);
            }
            else
            {
                var method = defalutFunc;
                return method.Method.Invoke(method, null);
            }
        }
        /// <summary>
        /// 添加默认处理函数
        /// </summary>
        /// <param name="defaultFunc"></param>
        public void AddDefault(Delegate defaultFunc)
        {
            this.defalutFunc = defaultFunc;
        }
        /// <summary>
        /// 添加键值对
        /// </summary>
        /// <param name="key"></param>
        /// <param name="func"></param>
        public void AddFunc(T key, Delegate func)
        {
            FuncGather.Add(key, func);
        }
        /// <summary>
        /// 添加多对键值
        /// </summary>
        /// <param name="funcs"></param>
        public void AddRange(KeyValuePair<T, Delegate>[] funcs)
        {
            foreach (KeyValuePair<T, Delegate> func in funcs)
            {
                FuncGather.Add(func.Key, func.Value);
            }
        }
        /// <summary>
        /// 移除键值对
        /// </summary>
        /// <param name="t"></param>
        public void Remove(T t)
        {
            FuncGather.Remove(t);
        }
        /// <summary>
        /// 获取函数
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public Delegate GetFunc(T t)
        {
            return FuncGather[t];
        }
        /// <summary>
        /// 是否包含键
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool ContainKey(T t)
        {
            if (FuncGather.ContainsKey(t))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 是否包含值
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool ContainValue(Delegate t)
        {
            if (FuncGather.ContainsValue(t))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 清空键值
        /// </summary>
        public void Clear()
        {
            FuncGather.Clear();
            count = 0;
        }
        public int Count
        {
            get { return count; }
        }
    }
}

测试用的函数,我最偏好的加减乘除,用什么其实都无所谓。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Configuration;
using System.Diagnostics;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            FuncSwitcher<ConsoleKey> Switcher = new FuncSwitcher<ConsoleKey>();
            ConsoleKeyInfo flag;
            Switcher.AddFunc(ConsoleKey.D0, new Action(() => { SwitchTest(); }));
            Switcher.AddFunc(ConsoleKey.D1, new Action(() => { CustomSwitchTest(); }));
            Switcher.AddFunc(ConsoleKey.D2, new Action(() => { Console.WriteLine("程序已经退出"); Environment.Exit(0); }));
            Switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); }));

            while (true)
            {
                Console.WriteLine("********************************");
                Console.WriteLine("*****  0:switch测试      ******");
                Console.WriteLine("*****  1: CustomSwitchTest******");
                Console.WriteLine("*****  2: 退出程序        ******");
                Console.WriteLine("********************************");

                flag = Console.ReadKey();
                Console.WriteLine();
                Switcher.Invoke(flag.Key, null);
            }
        }
        /// <summary>
        /// switch/case
        /// </summary>
        public static void SwitchTest()
        {
            Console.WriteLine("********************");
            Console.WriteLine("***** add:加   ****");
            Console.WriteLine("***** sub: 减   ****");
            Console.WriteLine("***** mul: 乘   ****");
            Console.WriteLine("***** div: 除   ****");
            Console.WriteLine("*****   0:返回 ****");
            Console.WriteLine("********************");
            Console.WriteLine("输入操作");
            string operate = Console.ReadLine();
            switch (operate)
            {
                case "add":
                    Console.WriteLine(Add(1, 1));
                    break;
                case "sub":
                    Console.WriteLine(Sub(1, 1));
                    break;
                case "mul":
                    Console.WriteLine(Mul(1, 1));
                    break;
                case "div":
                    Console.WriteLine(Div(1, 1));
                    break;
                default:
                    Console.WriteLine("重新输入");
                    break;
            }
        }
        /// <summary>
        /// 自定义的选择
        /// </summary>
        public static void CustomSwitchTest()
        {
            FuncSwitcher<string> switcher = new FuncSwitcher<string>();
            switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); }));
            switcher.AddRange(new KeyValuePair<string, Delegate>[]
            {
               new KeyValuePair<string,Delegate>("add", new Func<int,int,int>(Add)),
               new KeyValuePair<string,Delegate>("sub", new Func<int,int,int>(Sub)),
               new KeyValuePair<string,Delegate>("mul", new Func<int,int,int>(Mul)),
               new KeyValuePair<string, Delegate>("div", new Func<int, int, int>(Div)),
           });

            Console.WriteLine("********************");
            Console.WriteLine("***** add:加   ****");
            Console.WriteLine("***** sub: 减   ****");
            Console.WriteLine("***** mul: 乘   ****");
            Console.WriteLine("***** div: 除   ****");
            Console.WriteLine("*****   0:返回 ****");
            Console.WriteLine("********************");
            Console.WriteLine("输入操作");
            string operate = Console.ReadLine();
            Console.WriteLine(switcher.Invoke(operate, new object[] { 1, 1 }));
        }
        /// <summary>
        /// 测试所用,无所谓了,什么函数都可以的
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int Add(int x, int y)
        {
            return x + y;
        }
        public static int Sub(int x, int y)
        {
            return x - y;
        }
        public static int Mul(int x, int y)
        {
            return x * y;
        }
        public static int Div(int x, int y)
        {
            if (y != 0)
                return x / y;
            else throw new DivideByZeroException("除数不可以为0");
        }
    }
}
时间: 2024-10-23 19:16:13

数据字典+匿名委托模拟switch/case功能的相关文章

Python实现类似switch...case功能

最近在使用Python单元测试框架构思自动化测试,在不段的重构与修改中,发现了大量的if...else之类的语法,有没有什么好的方式使Python具有C/C#/JAVA等的switch功能呢? 在不断的查找和试验中,发现了这个:http://code.activestate.com/recipes/410692/,并在自己的代码中大量的应用,哈哈,下面来看下吧: 下面的类实现了我们想要的switch. class switch(object): def __init__(self, value)

c++模板元编程五:switch/case语句编译时运行

2.4 switch/case 替代 现在模拟switch/case语句,不过也是在编译期运行.先看调用代码和输出结果 // test case cout << "test case" << endl; Case<2>::Run(); test case case 2 实现代码很简单,还是模板特化 template<int v> class Case { public: static inline void Run() { cout &l

[EXCEL]实现类似Switch case的函数功能

[EXCEL]实现类似Switch case的函数功能 如果你就10种商品的话还好说,再多就不划算了. 假设你"商品1"的价格是"价格1", 那你就在B1里入 =vlookup(A1,{"商品1","价格1";"商品2","价格2";"商品3","价格3";..."商品10","价格10"},2,0) 注意:

使用C模拟ATM练习switch..case用法

这个实例很简单,看一下就能明白,至于我已经对C比较熟悉了,为什么还要从这么简单的例子入手,这个需要再详细的说明一下.由于之前学习C的时候,就是急功近利,没有仔细的去品味C中,特别是指针中的一些乐趣,所以我选择从基础再学习一遍,就这样咯. #include <stdio.h> /** * 实现自动取款机界面的模拟来学习使用switch语句 * switch...case语句的结构 * switch(int类型变量){ * case 1: //如果是1,进行相应的处理 * .... * break

C语言switch/case圈复杂度优化重构

软件重构是改善代码可读性.可扩展性.可维护性等目的的常见技术手段.圈复杂度作为一项软件质量度量指标,能从一定程度上反映这些内部质量需求(当然并不是全部),所以圈复杂度往往被很多项目采用作为软件质量的度量指标之一. C语言开发的项目中,switch/case代码块是一个很容易造成圈复杂度超标的语言特性,所以本文主要介绍下降低switch代码段的重构手段(如下图).switch圈复杂度优化重构可分为两部分:程序块的重构和case的重构.程序块重构是对代码的局部优化,而case重构是对代码的整体设计,

Python | 基础系列 &#183;?Python为什么没有switch/case语句?

与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): switcher = { 0: "zero", 1: "one", 2: "two", } return switcher.get(argument, "nothing") 这段代码的作用相当于: function(argument)

10-14C#基础--语句(switch....case和for...循环)

10-14C#基础--语句(2) 一.课前作业:“跟电脑猜拳” 二.switch(定义的变量,参数值)......case.... 注:switch...case大多用于值类型的判断,这里不同于if表达式(关系运算). 练习1: 练习2: 三.for(“因为”)....循环 知识点1: 知识点2:加break(跳转),跳出循环体. 练习1: 练习2: 练习3: 或者下面这种方法: 注: 练习5: 以上是switch...case..语句和for...语句的知识点,而for...语句是功能最多的循

C语言中switch...case语句中break的重要性

在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf("apple"); break; case 2:printf("banana"); break; case 3:printf("orange"); break; case 4:printf("pear"); break; cas

(c语言)函数间的调用,switch case

问题描述: 编写以下四个函数: init();//设计函数初始化数组为 1 2 3 4 5 6 7 8 9 10 sort();//设计排序函数,实现数组的降序排列:10 9 8 7 6 5 4 3 2 1 empty();//清空数组,全为0 show();//显示数组 程序分析: 程序的思路:a.先将程序的头和尾写好,在主函数中将要被处理的两个参数(一个数组arr,和数组的长度len).b.再封装那几个函数,额外加上一个menu函数.c.在主函数中用switch case语句调用这几个函数.