List<T> 排序

两个排序接口:IComparable与IComparer,均有泛型支持

public interface IComparable  
{
  int CompareTo(object obj);
}

public interface IComparer
{
  int Compare(object x,object y);
}

基类型都实现了IComparable.

string a = "aa";

string b = "bb";

int return = a.CompareTo(b);

return=-1;

返回值:a>b,返回1;a=b,返回0;a<b,返回-1.

int return = System.Collections.Comparer.Default.Compare(a, b);

 System.Collections.Comparer是个实现了ICompare的类.

 

List<T>.Sort(); 方法1

List<T>.Sort(Comparison<T> comparison); 方法2

List<T>.Sort(Compare<T> comparer); 方法3

  方法1是默认排序,类型T必须实现了IComparable接口,若自定义类Person,没有实现该接口,运行时有错.

  方法2的参数是一个有两个参数的泛型委托:

public delegate int Comparison<in T>(T x, T y)

自定义类不用实现IComparable接口,就可以通过该委托进行排序.

   方法3参数Compare是一个接口,里面有一个方法:int Compare(T x,T y);

public class tmodel:Icomparable
{
public string username { get; set; }
public int age { get; set; }
public int CompareTo(object obj)
{
tmodel m = obj as tmodel;
if (age > m.age)
{
return 1;
}
else if (age == m.age)
return 0;
else
return -1;
}
}
public class mycompare : IComparer<tmodel>
{

public int Compare(tmodel x, tmodel y)
{
return y.username.CompareTo(x.username);
throw new NotImplementedException();
}
}
 list.Sort();//如果类tmodel没有实现IComparable接口,这样调用运行时会报错
list.Sort(delegate(tmodel a, tmodel b) { return a.username.CompareTo(b.username); });//此处用的是匿名委托,此时按字段username从小到大排序,若想从大到小排序,return b.username.CompareTo(a.username).
list.Sort(new mycompare());此参数是一个实现IComparer接口的类.

三种方法,第二种最简单与实现.即参数是一个委托,此委托有两个参数,返回int.

posted @ 2012-02-18 16:27  pantherbean  阅读(367)  评论(0编辑  收藏  举报