新手学委托之委托的应用(二)

在第一篇《新手学委托之初识委托》中已经说了委托的一些基本知识以及具体举例,这次准备说一下委托的一些具体应用。

例二:

委托应用值数据过滤

namespace 委托应用之数组过滤
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list1 = new List<int>();
            list1.Add(45);
            list1.Add(11);
            list1.Add(300);
            list1.Add(12);
            list1.Add(-5);
           Console.WriteLine("+++++过滤正数+++++");
            List<int> list2 = new List<int>();

            foreach (int i in list1)
            {
                if (i >= 0)
                {
                    list2.Add(i);
                }
            }

            foreach (int i in list2)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("+++++过滤偶数+++++");
            List<int> list3 = new List<int>();
            foreach (int i in list1)
            {
                if (i % 2 == 0)
                {
                    list3.Add(i);
                }
            }

            foreach (int i in list3)
            {
                Console.WriteLine(i);
            }
} } }

这是一个很普通的利用泛型集合来进行过滤的方法,那我们用委托该怎么做呢?委托在其中有扮演着什么角色呢?

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace 委托应用之数组过滤
 7 {
 8     //第二步
 9     //声明委托FilterDelerete
10     delegate bool FilterDelerete(int i);
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //第一步
16             List<int> list1 = new List<int>();
17             list1.Add(45);
18             list1.Add(11);
19             list1.Add(300);
20             list1.Add(12);
21             list1.Add(-5);
22 
23             Console.WriteLine("+++++过滤正数+++++");
24             //第六步
25             //这里就是实现Filter的地方了,传入一个泛型集合list1和一个方法zhengshu
26             List<int> newList = Filter(list1, zhengshu);
27             foreach (int i in newList)
28             {
29                 Console.WriteLine(i);
30             }
31 
32             Console.WriteLine("+++++过滤偶数+++++");
33             //第七步
34             //假设Filter是牛人写的,普通的开发人员只要写oushu方法就可以了
35             //不用关心Filter的内部实现,只要指定过滤方法,这就是可以看得见的一大好处
36             List<int> newlist1= Filter(list1, oushu);
37             foreach (int i in newlist1)
38             {
39                 Console.WriteLine(i);
40             }
41             Console.ReadKey();
42         }
43 
44         //第三步
45         //定义和委托写法差不多的方法,这个是过滤正数的
46         static bool zhengshu(int i1)
47         {
48             return i1 >=0;
49         }
50 
51         //第四步
52         //这个是过滤偶数的
53         static bool oushu(int i2)
54         {
55             return i2 % 2 == 0;
56         }
57 
58         //第五步
59         //将过滤正数和偶数的写成一个方法,注意这只是将过滤正数和偶数的抽取出来写成一个方法而已,不要多想
60         //在这里需要传入委托FilterDelerete的一个对象
61         //这里怎么要传入FilterDelerete的一个对象呢?
62         //我们来想想,我们声明的委托是传入 int i,返回的参数是bool,假设我们出入的 f 指向的方法是 zhengshu(),向上数12行,返回的是true的数字不是添加到 list3.Add(i)了吗(向下看)!
63         static List<int> Filter(List<int> list, FilterDelerete f)
64         {
65             List<int> list3 = new List<int>();
66             foreach (int i in list)
67             {
68                 //在这一刻程序员也不知道f到底指向那个函数
69                 //只知道这个函数是有一个int类型参数,一个bool返回值
70                 if (f(i))
71                 {
72                     list3.Add(i);
73                 }
74             }
75             return list3;
76         }
77     }
78 }

好了,一个例子看完了,在回想一下,委托在其中扮演着一个什么角色呢?

例三:

委托应用之字符串数据处理

下面这个例子就不再过多的说明的,大家自己理解啊!

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace 委托应用之字符串数据处理
 7 {
 8     delegate string ProcessStringDelegete(string s);
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             string[] value = new string[] { "As", "sB" };
14             //for (int i = 0; i < value.Length;i++ )
15             //{
16             //    value[i] = value[i].ToLower();
17             //}
18             //for (int i = 0; i < value.Length; i++)
19             //{
20             //    value[i] = value[i].ToUpper();
21             //}
22             Process(value,ToUpper);
23             Process(value, FKH);//不用懂for循环可以对字符串数组进行处理
24             Console.WriteLine(string.Join(",", value));
25             Console.ReadKey();
26         }
27         static void Process(string[] value,ProcessStringDelegete p)
28         {
29             for (int i = 0; i < value.Length; i++)
30             {
31                 value[i] = p(value[i]);
32             }
33         }
34 
35         static string FKH(string s1)
36         {
37             return "[" + s1 + "]";
38         }
39 
40         static string ToUpper(string s)
41         {
42             return s.ToUpper();
43         }
44     }
45 }

 

 

 

posted @ 2012-04-18 22:14  烧点饭  阅读(708)  评论(1编辑  收藏  举报