Fun<>,匿名方法,Lambda表达式 冒泡排序C#

大头文

分享,进步

冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式

冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更高效的排序方法。
这里的实现的冒泡排序,需实现功能:
不仅数字排序,还要对任意对象排序

示例:

  • 对People对象的Age(年龄)排序
  • 对Student对象的Score(分数)排序

People:

    public class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public People(string name, int age)
        {
            Name = name;
            Age = age;
        }
        public static bool CompareAge(People p1, People p2)
        {
            return p1.Age < p2.Age;
        }
        public override string ToString()
        {
            return string.Format("[people] name:{0},age:{1}", Name, Age);
        }
    } 

Student:

    public class Student
    {
        public string Name { get; set; }
        public float Score { get; set; }
        public Student(string name, float score)
        {
            Name = name;
            Score = score;
        }
        public static bool CompareScore(Student s1, Student s2)
        {
            return s1.Score < s2.Score;
        }
        public override string ToString()
        {
            return string.Format("[student] name:{0},score:{1}",Name,Score);
        }
    } 

冒泡排序的实现,如果对Fun<>的委托写法不懂,最后有说明。

    public static class Storter_Fun
    {
        public static void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparision)
        {
            bool swapped = true;
            do
            {
                swapped = false;
                for (int i = 0; i < sortArray.Count - 1; i++)
                {
                    if (comparision(sortArray[i + 1], sortArray[i]))
                    {
                        T temp = sortArray[i];
                        sortArray[i] = sortArray[i + 1];
                        sortArray[i + 1] = temp;
                        swapped = true;
                    }
                }
            } while (swapped);
        }
    }  

控制台,使用排序:

        static void Main(string[] args)
        {
            //人按年龄排序
            People[] peoples = {new People("张三",43),
                               new People("李四",12),
                               new People("王五",50),
                               new People("吴六",21),
                               new People("陈七",33),};
            //Fun<>委托的写法
            BubbleSorter.Storter_Fun.Sort<People>(peoples, People.CompareAge);
            //匿名方法的写法
            BubbleSorter.Storter_Fun.Sort<People>(peoples, delegate(People p1, People p2)
            {
                return p1.Age < p2.Age;
            });
            //Lambdah表达式的写法
            BubbleSorter.Storter_Fun.Sort<People>(peoples, (People p1, People p2) =>
            {
                return p1.Age < p2.Age;
            });
            foreach (var people in peoples)
            {
                Console.WriteLine(people);
            }
            //学生按分数排序
            Student[] students = {new Student("张三",80.5F),
                               new Student("李四",85),
                               new Student("王五",88),
                               new Student("吴六",70),
                               new Student("陈七",95),};
            BubbleSorter.Storter_Fun.Sort<Student>(students, Student.CompareScore);
            foreach (var student in students)
            {
                Console.WriteLine(student);
            }
            Console.ReadKey();
        }  

委托:调用方法的参数一般情况是数值型的,例如int,string,DataTable等等,能不能将方法本身作为一个参数传递给另一个方法呢?委托就是解决这个问题的。
既然是参数,要就有类型。C#是强类型,方法的参数是int类型,就不能传string类型进去,否则在编辑阶段就报错了。
int,string等是已有的类型,委托的类型就需要自定义。
例如上面例子用到的:

  • Fun<t, t,="" bool=""> 代表方法是传入两个泛型参数,返回bool;
  • Fun<int,string,datatable,array> 代表方法是传入三个参数:int, string,DataTable,返回Array;
    就是最后一个参数为返回值类型;
    那么如果没有返回值呢?
  • Action<t,t> 代表方法是传入两个泛型参数,没返回值
  • Action<int,string> 代表方法是传入两个参数:int,string,没返回值
    定义了委托的类型,传入的方法必须要符合这个定义,即:传入参数,类型,个数,顺序,返回值要一致,否则编译不过,C#是强类型的原因。

刚实现的冒泡可以支持不同对象的排序,主要是将冒泡比较大小方法传递进来(委托),与交换数据的临时变量使用了泛型实现;

分类: C#

时间: 2024-11-20 20:35:41

Fun<>,匿名方法,Lambda表达式 冒泡排序C#的相关文章

18、(番外)匿名方法+lambda表达式

概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数. C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部.也不能在匿名方法外部使用的ref和out参数.

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数. [csharp] view plaincopy class Program { delegate int CalculateDelegate(int a, int b); int add(int a, int b) { return a + b; } s

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

Cocos2d-x v3.0 新的事件调度方法 lambda表达式的使用

欢迎添? Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/24603251 Cocos 2d-x 3.0 版本号中引入了C++ 11的特性.当中就包括了回调函中使用Lambda对象. 以下我们来看一段TestCpp中的代码: 在上图的触摸事件的回调函数中,共使用了三次Lambda表达式: [ ](Touch * touch,Event * event){ }; 以下我们就来介绍一

【Unity|C#】基础篇(9)——匿名函数/Lambda表达式

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜鸟教程

Python匿名函数——lambda表达式

如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式并不包含return语句,凡是使用函数作为参数或返回值的地方,都可以使用lambda表达式,lambda函数的好处有: 简便,顺手 可以不给函数起名字,某些不需要重用该函数的地方,实质上不需要给函数想一个名字 下面的例1将lambda表达式定义的函数作为内置函数filter的参数, 例1. 将lam

面向对象设计——原来“Lambda表达式”是这样来的

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法. C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式. --MSDN 以上是来自MSDN中的话,可以看出声明委托的这样一个发展:命名方法→匿名方法→Lambda表达式.下面通过代码展示一下他们是如何进化的. 命名方法 对于更高层次的面象对象而言,委托是必须.那么,我们就以实现"求两个数中的最大数"为例看最原始的委托实现方式. 声明一个成员方法:

Lambda表达式与方法引用

1 Lambda表达式 1.1 函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是"拿数据做数据" 面向对象思想强调"必须通过对象的形式来做事情" 函数式思想则尽量忽略面向对象的复杂语法:"强调做什么,而不是以什么形式去做" 而我们要学的Lambda表达式就是函数式思想的体现 1.2 体验Lambda表达式 需求:启动一个线程,在控制台输出一句话:多线程程序启动了 方式1: 定义一个类MyRunnable实现Runnab

如何快速使用Lambda 表达式(C# )

Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 . 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 =>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块. 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值. 如下面的示例所示,你可以将此表达式分配给委