分享一道C#使用委托来求最大值的面试题你会不?

需求:

对一个数组进行处理,获取其中最大值,但是类型不定,“最大值”的算法也不一样。使用委托把最大算法稳定下来,把比较规则通过委托进行“开放”?
分享一道C#使用委托来求最大值的面试题你会不?

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsole
{

    class Program
    {
        delegate bool CompareNum(object obj1, object obj2);
        static void Main(string[] args)
        {
            object[] objs = { 1, 2, 4, 4, 2, 1, 2, 3 };
            //通过这样写,获取最大值的算法已经确定,在传参数的是后指定上比较方法就好了
            //用委托后,我们不在为每个获取最大值的方法都去写一种算法
            int max=(int)GetMax(objs, CompareInt);//原生的写法为GetMax(objs,new CompareNum(CompareInt));//只不过编译器帮我们进行了处理
            Console.WriteLine(max);
            Console.ReadKey();
        }
        static bool CompareInt(object obj1, object obj2)
        {
            int i1 = (int)obj1;
            int i2 = (int)obj2;
            return i1 > i2;
        }
        static object GetMax(object[] obj, CompareNum cpn)
        {
            object max = obj[0];
            for (int i = 1; i < obj.Length; i++)
            {
                if (!cpn(max, obj[i]))
                {
                    max = obj[i];
                }
            }
            return max;
        }
    }
}

使用匿名方法改造GetMax方法

    {
        delegate bool CompareNum(object obj1, object obj2);
        static void Main(string[] args)
        {

            object[] objs = { 1, 2, 4, 4, 2, 1, 2, 3 };
           
            CompareNum cpn = delegate (object obj1, object obj2)
            {
                int i1 = (int)obj1;
                int i2 = (int)obj2;
                return i1 > i2;
            };         
            int max = (int)GetMax(objs, cpn);//使用匿名方法
            Console.WriteLine(max);
            Console.ReadKey();
        }
        static bool CompareInt(object obj1, object obj2)
        {
            int i1 = (int)obj1;
            int i2 = (int)obj2;
            return i1 > i2;
        }
        static object GetMax(object[] obj, CompareNum cpn)
        {
            object max = obj[0];
            for (int i = 1; i < obj.Length; i++)
            {
                if (!cpn(max, obj[i]))
                {
                    max = obj[i];
                }
            }
            return max;
        }
    }
}

其实还可以更简略,比如lamda...

上一篇:C#线程同步深入


下一篇:使用Redis有哪些好处?redis相比memcached有哪些优势?