柚子快报邀请码778899分享:步步为营-25-委托(比大小)
1.1 找出int数组中的最大值,我们可能会这样写
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
class Program
{
static void Main(string[] args)
{
int[] ins = {1,2,33,44,3421,1,5,2,9,6 };
int max = GetMax(ins);
Console.WriteLine(max);
Console.Read();
}
private static int GetMax(int[] ins)
{
int max = ins[0];
foreach (int item in ins)
{
if (max < item)
{
max = item;
}
}
return max;
}
}
}
找出整形数组的最大值
1.2 如果要找出string数组的最大长度呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
class Program
{
static void Main(string[] args)
{
int[] ins = {1,2,33,44,3421,1,5,2,9,6 };
string[] strs = { "asdf",";ljsdfasldj","uasjaldf","s","asdfasdf"};
int max = GetMax(ins);
string maxStr = GetMax(strs);
Console.WriteLine(max);
Console.WriteLine(maxStr);
Console.Read();
}
private static int GetMax(int[] ins)
{
int max = ins[0];
foreach (int item in ins)
{
if (max < item)
{
max = item;
}
}
return max;
}
private static string GetMax(string[] strs)
{
int max = strs[0].Length;
string str = strs[0];
foreach (string item in strs)
{
if (max < item.Length)
{
max = item.Length;
str = item;
}
}
return str;
}
}
}
View Code
1.3 我们可以把它们以委托的方式写出来通过分析可以发现,两种比较方法在调用具体比较时所用的方法是不同,而且如果要统一写的化应该用object[]代替
1.3.1 声明委托,用于比较两个对象,返回值是int ,例如传入两个string,通过内部比较返回是否>0,以区别两个,字符串类型的长度.
public delegate int delCompare(object o1,object o2);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
public delegate int delCompare(object o1,object o2);
class Program
{
static void Main(string[] args)
{
object[] ins = {1,2,33,44,3421,1,5,2,9,6 };
object[] strs = { "asdf",";ljsdfasldj","uasjaldf","s","asdfasdf"};
//比较整形数组
delCompare del = new delCompare(IntCompare);
object max = GetMax(ins, del);
//比较字符串
object maxStr = GetMax(strs, StringCompare);
Console.WriteLine(max);
Console.WriteLine(maxStr);
Console.Read();
}
private static object GetMax(object[] objs,delCompare delc)
{
object max = objs[0];
foreach (object item in objs)
{
if (delc(max,item) < 0)
{
max = item;
}
}
return max;
}
private static int IntCompare(object o1,object o2)
{
return (int)o1 - (int)o2;
}
private static int StringCompare(object o1, object o2)
{
return o1.ToString().Length - o2.ToString().Length;
}
}
}
View Code
1.4 进一步升级
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
public delegate int delCompare(object o1,object o2);
class Program
{
static void Main(string[] args)
{
object[] ins = {1,2,33,44,3421,1,5,2,9,6 };
object[] strs = { "asdf",";ljsdfasldj","uasjaldf","s","asdfasdf"};
//比较整形数组
// delCompare del = new delCompare(IntCompare); //1.0 通过定义委托调用方法
//object max = GetMax(ins, del);
object max = GetMax(ins, (o1, o2) => { return (int)o1 - (int)o2; });
//比较字符串
// object maxStr = GetMax(strs, StringCompare); //2.0 直接调用方法
// object maxStr = GetMax(strs, delegate(object o1, object o2) { return o1.ToString().Length - o2.ToString().Length; });//3.0 通过匿名方法
object maxStr = GetMax(strs, (o1, o2) => { return o1.ToString().Length - o2.ToString().Length; }); //4.0 lmadba表达式
Console.WriteLine(max);
Console.WriteLine(maxStr);
Console.Read();
}
private static object GetMax(object[] objs,delCompare delc)
{
object max = objs[0];
foreach (object item in objs)
{
if (delc(max,item) < 0)
{
max = item;
}
}
return max;
}
}
}
View Code
1.5 那么现在如果加一个Person类呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
public class Person
{
public String Name { get; set; }
public int Age { get; set; }
}
}
Person
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
public delegate int delCompare(object o1,object o2);
class Program
{
static void Main(string[] args)
{
object[] ins = {1,2,33,44,3421,1,5,2,9,6 };
object[] strs = { "asdf",";ljsdfasldj","uasjaldf","s","asdfasdf"};
Person[] perons = { new Person { Name = "张三", Age = 40 }, new Person { Name = "李四", Age = 50 }, new Person { Name = "王五", Age = 80 } };
//比较整形数组
// delCompare del = new delCompare(IntCompare); //1.0 通过定义委托调用方法
//object max = GetMax(ins, del);
object max = GetMax(ins, (o1, o2) => { return (int)o1 - (int)o2; });
//比较字符串
// object maxStr = GetMax(strs, StringCompare); //2.0 直接调用方法
// object maxStr = GetMax(strs, delegate(object o1, object o2) { return o1.ToString().Length - o2.ToString().Length; });//3.0 通过匿名方法
object maxStr = GetMax(strs, (o1, o2) => { return o1.ToString().Length - o2.ToString().Length; }); //4.0 lmadba表达式
//比较Person
object maxPeople = GetMax(perons,(o1,o2) =>{ Person p1 = (Person)o1 ;Person p2 = (Person)o2 ;return p1.Age - p2.Age;});
Person pMax = (Person)maxPeople;
Console.WriteLine(max);
Console.WriteLine(maxStr);
Console.WriteLine(pMax.Name);
Console.Read();
}
private static object GetMax(object[] objs,delCompare delc)
{
object max = objs[0];
foreach (object item in objs)
{
if (delc(max,item) < 0)
{
max = item;
}
}
return max;
}
}
}
View Code
1.6 继续观察发现
object max = GetMax(ins, (o1, o2) => { return (int)o1 - (int)o2; });
object maxStr = GetMax(strs, (o1, o2) => { return o1.ToString().Length - o2.ToString().Length; }); //4.0 lmadba表达式
object maxPeople = GetMax(perons,(o1,o2) =>{ Person p1 = (Person)o1 ;Person p2 = (Person)o2 ;return p1.Age - p2.Age;});
这其中都有类型转换,装箱拆箱比较麻烦
1.7 泛型委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_GetMax
{
public delegate int delCompare
class Program
{
static void Main(string[] args)
{
int[] ins = {1,2,33,44,3421,1,5,2,9,6 };
string[] strs = { "asdf",";ljsdfasldj","uasjaldf","s","asdfasdf"};
Person[] perons = { new Person { Name = "张三", Age = 40 }, new Person { Name = "李四", Age = 50 }, new Person { Name = "王五", Age = 80 } };
//比较整形数组
// delCompare del = new delCompare(IntCompare); //1.0 通过定义委托调用方法
//object max = GetMax(ins, del);
int max = GetMax(ins, (o1, o2) => { return o1 - o2; });
//比较字符串
// object maxStr = GetMax(strs, StringCompare); //2.0 直接调用方法
// object maxStr = GetMax(strs, delegate(object o1, object o2) { return o1.ToString().Length - o2.ToString().Length; });//3.0 通过匿名方法
string maxStr = GetMax(strs, (o1, o2) => { return o1.Length - o2.Length; }); //4.0 lmadba表达式
//比较Person
object maxPeople = GetMax(perons,(o1,o2) =>{return o1.Age - o2.Age;});
Person pMax = (Person)maxPeople;
Console.WriteLine(max);
Console.WriteLine(maxStr);
Console.WriteLine(pMax.Name);
Console.Read();
}
private static T GetMax
{
T max = objs[0];
foreach (T item in objs)
{
if (delc(max,item) < 0)
{
max = item;
}
}
return max;
}
}
}
View Code
柚子快报邀请码778899分享:步步为营-25-委托(比大小)
好文阅读
发表评论