冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过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#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式的更多相关文章

  1. [转]javascript指定事件处理程序包括三种方式:

    javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...

  2. (转)maven怎么 引入(或引用/使用) 自定义(或本地/第三方) jar的三种方式 图文教程 方法二最简单

    转:https://blog.csdn.net/wabiaozia/article/details/52798194 准备工作: 假如我有一个自定义jar是:123456.jar,下载地址http:/ ...

  3. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  4. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  5. C#多线程+委托+匿名方法+Lambda表达式

    线程 下面是百度写的: 定义英文:Thread每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它 ...

  6. C#委托总结-匿名方法&Lambda表达式

    1,匿名方法 匿名方法可以在声明委托变量时初始化表达式,语法如下 之前写过这么一段代码: delegate void MyDel(string value); class Program { void ...

  7. 编写Unity3D着色器的三种方式

    不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...

  8. iOS:延时执行的三种方式

    延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器   第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...

  9. ajax数据提交数据的三种方式和jquery的事件委托

    ajax数据提交数据的三种方式 1.只是字符串或数字 $.ajax({ url: 'http//www.baidu.com', type: 'GET/POST', data: {'k1':'v1'}, ...

随机推荐

  1. 微信小程序要调数据 微信小程序 for 循环详解

    现在要完成这样的效果: 我的代码是: <view class="l-setlist clr" > <template name="listab" ...

  2. NET Framework、.NET Core、Xamarin

    认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET Core.Xamarin三驾马车 其中.NET Framework是基于Windows平台专属的开 ...

  3. Troubleshooting routing topology based on a reference topology

    In one embodiment, a computing device (e.g., border router or network management server) transmits a ...

  4. android高仿人人网

    经过几个月的努力,终于基本完成了人人API拥有的所有功能,界面采用仿照人人梦想版5.13制作,其中资源文件也采用人人的APK文件资源,完成的功能及知识点如下: 1.通过三种动画仿照出人人引导页的放大切 ...

  5. 《用户体验要素》澄清了 UI 原型设计中看不见确感受得到的那一层

    <用户体验要素>澄清了看不见确感受得到的那一层 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&quo ...

  6. 如何停止处于stopping状态的windows服务(使用taskkill)

    工作中有时需要启动和停止windows service,有时候会出现服务处于stopping或者starting的状态,但是,在services界面中,start service/stop servi ...

  7. WPF制作Logo,很爽,今后在应用程序中加入Logo轻松,省事!

    原文:WPF制作Logo,很爽,今后在应用程序中加入Logo轻松,省事! 这是效果: XAML代码:<Viewbox Width="723.955078" Height=&q ...

  8. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

  9. Java高级应用(一个)-文件夹监控服务

    最近.在研究一些比较成熟的框架.他们还发现,他们中的一些相当不错的文章.现在,对于一些在你们中间一个简单的翻译(版的英文文章,非常有帮助). 译:原文链接 你有没有发现,当你编辑一个文件.同一时候使用 ...

  10. 用WPF轻松打造iTunes CoverFlow效果

    原文:用WPF轻松打造iTunes CoverFlow效果 用WPF轻松打造iTunes CoverFlow效果                                             ...