参考
http://dobon.net/vb/dotnet/programing/icomparer.html
C#范型List类的Sort方法有四种形式,分别是
1,不带有任何参数的Sort方法----Sort();
2,带有比较器参数的Sort方法 ----Sort(IComparer<T>)
3,带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))
4,带有比较起参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))
首先介绍第一种方法,使用这种方法不是对List中的任何元素对象都可以进行排序,List中的元素对象必须继承IComparable接口,并且要实现IComparable接口中的CompareTo()方法,在CompareTo()方法中要自己实现对象的比较规则。详细可以参照如下代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace Comparer.SortObject
{
}
第二种带有比较器参数的Sort方法,List中的元素对象不需要继承IComparable接口,但需要额外创建一个对象的比较器,下面的代码中的SortTestObj2类是准备要保存到范型List中的对象,SortTestObj2Camparer 类则是SortTestObj2类的比较器,这个比较起必须继承IComparer<T>接口,并且实现接口中的Compare()方法。详细做法可参照下面的代码。
SortTestObj2类
using System;
using System.Collections.Generic;
using System.Text;
namespace Comparer.SortObject
{
}
SortTestObj2Camparer类
using System;
using System.Collections.Generic;
using System.Text;
using Comparer.SortObject;
namespace Comparer.Camparer
{
}
第三种方法需要编写一个对象排序比较的方法,对List中的元素对象没有特殊的要求,但在比较方法中需要实现对象比较规则,这个方法实现后,就可以把这方名字作为参数委托给List的Sort方法,Sort方法在排序时会执行这个方法对List中的对象进行比较,详细可参照下面的代码。对List中元素我们还使用上面的SortTestObj2类对象。
=========================================================================================
List<int> listTest = new List<int>();
listTest.Add(3);
listTest.Add(1);
listTest.Add(4);
上記のListであれば
listTest.Sort();
とすれば昇順になります。
でも、これを降順にするには・・?
そしてさらに自作クラスの場合は?となるわけです。
降順にするにはこう記述します。
listTest.Sort(delegate(int a, int b){ return b - a; });
自作クラスも、これと同様にすることができます。
例えば以下のようなクラスがあったとします。
------------------
class MyClassA
{
private int age; //年齢
private string name; //名前
public int Age
{
get{ return age; }
set{ age = value; }
}
public string Name
{
get{ return name; }
set{ name = value; }
}
}
------------------
それがリストに入っていたとします。
List<MyClassA> listMyClass = new List<MyClassA>();
:
:
:
年齢昇順
listMyClassA.Sort(delegate(MyClassA mca1, MyClassA mca2){ return mca1.Age - mca2.Age; });
年齢降順
listMyClassA.Sort(delegate(MyClassA mca1, MyClassA mca2){ return mca2.Age - mca1.Age; });
名前昇順
listMyClass.Sort(delegate(MyClassA mca1, MyClassA mca2) { return string.Compare(mca1.Name, mca2.Name); });
名前降順
listMyClass.Sort(delegate(MyClassA mca1, MyClassA mca2) { return string.Compare(mca2.Name, mca1.Name); });
//排序
this.TestCellTypeList.Sort((x, y) => x.No - y.No);
oList.Find((testOrder) => testOrder.No == (i + 1));
var info = this.TestCellTypeList.FirstOrDefault((s) => s.No == no );
.Net Framework 的开源代码