C#泛型委托

任务:

(1)找出int数组里面最大值的那个元素
(2)找出string数组里面最长的那个元素
(3)找出Person数组里面年龄最大的那个元素的名字

一、下面代码是比较原始的做法

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

namespace GetMaxExample
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
            string[] names = { "张", "李四", "王五明", "zhafdsfdsfds" };
            Person[] persons = { new Person { Age = 12, Name = "小花" }, new Person { Age = 15, Name = "刘伟" }, new Person { Age = 22, Name = "东东" } };

            int maxInt = 0;
            string LengthName = string.Empty;
            Person person = null;
            Console.WriteLine(GetMaxInt(nums, maxInt));
            Console.WriteLine(GetLengthString(names,LengthName));
            Console.WriteLine(GetPersonName(persons,person));


        }
        #region 最原始的方式
        //找出int数组里面最大值的那个元素
        static int GetMaxInt(int[] nums,int max)
        {
            max = nums[0];
            for (int i = 0; i < nums.Length; i++)
            {
                
                if (nums[i]>max)
                {
                    max = nums[i];
                }
            }
            return max;
        }
        //找出string数组里面最长的那个元素
        static string GetLengthString(string[] names,string name)
        {
            name = names[0];
            for (int i = 0; i < names.Length; i++)
            {
                if ((names[i].Length-name.Length)>0)
                {
                    name = names[i];
                }
            }
            return name;
        }
        //找出Person数组里面年龄最大的那个元素的名字
        static string GetPersonName(Person[] persons,Person person)
        {
            person = persons[0];
            for (int i = 0; i < persons.Length; i++)
            {
                if (persons[i].Age>person.Age)
                {
                    person = persons[i];
                }
            }
            return person.Name;
        }
        #endregion

        static object 
    }

    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

}

二、统一用Ojbect类型来进行比较(涉及到拆箱和装箱,效率不高)

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

namespace _02求数组的最大值
{
    public delegate int DelCompare(object o1, object o2);
    class Program
    {
        static void Main(string[] args)
        {
            object[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

            object[] names = { "张三", "李四", "王五", "zhafdsfdsfds" };
            
            object[] pers = { new Person() { Name = "张三", Age = 19 }, new Person() { Name = "李四", Age = 29 } };

            #region 整型数组比较
            DelCompare delComInt = new DelCompare(C1);
            object maxNum = GetMax(nums, delComInt);
            Console.WriteLine((int)maxNum);
            #endregion

            #region 字符串数组比较
            DelCompare delComString = new DelCompare(C2);
            object lengthName = GetMax(names, delComString);
            Console.WriteLine((string)lengthName);
            #endregion

            #region Person数组比较
            //正常使用委托
            DelCompare delComPerson = new DelCompare(C3);
            object maxAgeName = GetMax(pers, delComPerson);
            //匿名函数
            //object maxAgeName = GetMax(pers, delegate(object o1, object o2) { return ((Person)o1).Age - ((Person)o2).Age; });
            //Lambda表达式
            //object maxAgeName = GetMax(pers, (o1, o2) => { return ((Person)o1).Age - ((Person)o2).Age; });
            Console.WriteLine(((Person)maxAgeName).Name);
            #endregion

        }

        static object GetMax(object[] array, DelCompare del)
        {
            object max = array[0];
            for (int i = 0; i < array.Length; i++)
            {
                if (del(max, array[i]) < 0)//需要传进来一个比较的方式
                {
                    max = array[i];
                }
            }
            return max;
        }
        static int C1(object o1, object o2)
        {
            int n1 = (int)o1;
            int n2 = (int)o2;
            return n1 - n2;
        }
        static int C2(object o1, object o2)
        {
            string s1 = (string)o1;
            string s2 = (string)o2;
            return s1.Length - s2.Length;
        }
        static int C3(object o1,object o2)
        {
            Person p1 = (Person)o1;
            Person p2 = (Person)o2;
            return p1.Age - p2.Age;
        }

    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

}

三、使用泛型委托和Lambda表达式

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

namespace TDelegateExample
{
    class Program
    {
        public delegate int DelCompare<T>(T T1, T T2);
        static void Main(string[] args)
        {
            int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8,9 };
            string[] names = { "agbaef", "atetq", "tiuqehlasd" };
            Person[] persons = { new Person() { Name = "张三", Age = 19 }, new Person() { Name = "李四", Age = 29 } };
            
            //泛型委托   Lambda表达式
            int numResult = GetMax(nums, (num1, num2) => { return num1 - num2; });
            Console.WriteLine(numResult);

            string stringResult = GetMax(names, (string1, string2) => { return string1.Length - string2.Length; });
            Console.WriteLine(stringResult);

            Person personResult = GetMax(persons, (person1, person2) => { return person1.Age - person2.Age; });
            Console.WriteLine(((Person)personResult).Name);
        }
        static T GetMax<T>(T[] array,DelCompare<T> del)
        {
            T max = array[0];
            for (int i = 0; i < array.Length; i++)
            {
                if (del(max,array[i])<0)
                {
                    max = array[i];
                }
            }
            return max;
        }
    }
    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,693评论 0 11
  • lambda表达式(又被成为“闭包”或“匿名方法”)方法引用和构造方法引用扩展的目标类型和类型推导接口中的默认方法...
    183207efd207阅读 1,467评论 0 5
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,482评论 0 4
  • 家人们好: 昨晚7点半准时到教堂,看到很多长辈围跪在一个年轻人身边,在切切祈祷。9点诗班学唱出来,看到还有四、五个...
    sandy201704阅读 100评论 0 0
  • 历史学家把杜甫的一生大致分为四个时期: 青年的漫游时期——写下《望岳》“岱宗夫如何,齐鲁青未了。” 困居长安十年—...
    咸鱼爱做梦阅读 9,708评论 4 14