冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过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. 【BZOJ 1036】[ZJOI2008]树的统计Count

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 [题意] [题解] 树链剖分入门题; 每一条链维护一个线段树就好; uppest ...

  2. 【codeforces 789C】Functions again

    [题目链接]:http://codeforces.com/contest/789/problem/C [题意] 看式子. [题解] 考虑最后的答案区间; 如果那个区间是从奇数位置的数字开始的; 那么奇 ...

  3. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...

  4. 如何获得iframe中元素的值

    在Web开发时,很多时候会遇到一个问题.我在一个页面嵌入了iframe,并且我想获得这个iframe页面某个元素的值.那么该如何实现这个需求呢? 先来看下演示: 效果演示     iframe1中文本 ...

  5. WinEdt && LaTex(五)—— 内容的排版

    1. 无序列表 需要的环境是\begin{itemize} \end{itemize} \begin{itemize} \item hello \item world \end{itemize} 2. ...

  6. C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成软件

    C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成 1,调用ffmpeg将外挂字幕“嵌入”视频中,保存副本: 2,调用ffmpeg将副本视频导出为gif图片. 参考资料 ...

  7. WPF“天狗食月”效果

    原文:WPF"天狗食月"效果 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/deta ...

  8. HDU 4279 Number(2012天津网络游戏---数论分析题)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:pid=4279">http://acm.hdu.edu ...

  9. WPF 自定义的图表(适用大量数据绘制)

    原文:WPF 自定义的图表(适用大量数据绘制) 在WPF中绘制图表比较简单,有很多的第三方控件,但是在绘制大量数据的时候,就显得有些吃力,即便是自己用StreamGeometry画也达不到理想的效果, ...

  10. DRP-ThreadLocal简单的理解

      简单就是jar一类套餐包.在一个简单的事情是一个工具类!该工具可以做?该工具被用来写多线程程序,行.多线程是有效的.你只能去网上找资料,由于今天我们仅仅来介绍ThreadLocal的知识. 我们来 ...