通过泛型委托使得在写代码时只需要传入一个对象数组和一个lambda表达式就可以对对象数组的属性进行排序
对于这种在调用时才能确定的操作,使用委托可以减少大量代码
这种方法稍微改一改,就可以写出很多有用的方法,比如求最大值,取满足条件的对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Student[] student = new Student[]{
new Student("a", 5),
new Student("b", 4),
new Student("c", 3),
new Student("d", 2),
new Student("e", 1)
};
ArrayHelper.OrderBy(student, a => a.age);
//传递lambda表达式,a就是个名字,随便什么都可以
foreach (var item in student)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
public class Student
{
public string name;
public int age;
public Student(string name,int age)
{
this.name = name;
this.age = age;
}
}
/// <summary>
/// 升序排序委托
/// </summary>
/// <typeparam name="T">对象</typeparam>
/// <typeparam name="TKey">对象的属性</typeparam>
/// <param name="t">传递的对象</param>
/// <returns></returns>
public delegate TKey SortHandler<T, TKey>(T t);
public class ArrayHelper
{
/// <summary>
/// 根据对象的属性从小到大进行排序
/// 使用方法ArrayHelper.OrderBy(object[],object=>object.property)
/// </summary>
/// <param name="array">对象数组</param>
/// <param name="sortHandler">存放了方法的委托</param>
static public void OrderBy<T,TKey>( T [] array, SortHandler<T, TKey> sortHandler) where TKey : IComparable<TKey>//使用此方法时,比较的属性需要实现了Icomparable接口
{
//这里使用的是冒泡排序,还可以使用其他的排序方式
for (int i = 0; i < array.Length; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (sortHandler(array[i]).CompareTo(sortHandler(array[j])) > 0)
{
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
}
}
写完后发现Linq已经封装好了,直接用就行了。。。
直接list.OrderBy,array.OrderBy,就行了,并且还有很多其他好用的方法
网上说Linq效率不好,不过好像是说数据库方面
在数组和List方面应该没什么问题,怎么也要比我自己写的好吧
虽然白写了,但弄明白了泛型委托的用法,以后也有机会用到吧