需求:
对一个数组进行处理,获取其中最大值,但是类型不定,“最大值”的算法也不一样。使用委托把最大算法稳定下来,把比较规则通过委托进行“开放”?
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...