1.IComparable接口定义
public class IComparable
{
int CompareTo(object o);
}
System.IComparable接口指定了一种允许一个对象可基于某些特定键值进行排序的行为。
2.示例
public class MyClass6:IComparable
{
public int Id { get; set; }
public string Name { get; set; }
public int CompareTo(object obj)
{
MyClass6 tp = obj as MyClass6; //对应的泛型接口,不需要做运行时类型检查
if (tp != null)
{
if (this.Id > tp.Id)
return 1;
if (this.Id < tp.Id)
return -1;
else
return 0; //由于该字段是int类型,可以直接返回this.Id.CompareTo(tp.Id);
}
else
throw new ArgumentException("......");
}
}
public class Test
{
private void Func1()
{
MyClass6[] arrCls6 = new MyClass6[4];
arrCls6[0] = new MyClass6 { Id = 1, Name = "aaaa" };
arrCls6[1] = new MyClass6 { Id = 3, Name = "bbbb" };
arrCls6[2] = new MyClass6 { Id = 4, Name = "cccc" };
arrCls6[3] = new MyClass6 { Id = 2, Name = "dddd" };
//这里如果为内置的数据类型(int,string...),它们实现了IComparable接口,
//可以使用System.Array类的Sort()静态方法对数组进行排序,自定义类型想要支持排序,需要实现该接口
//这里MyClass6可以根据需要,选择排序的基准,让该自定义类知道如何和自己类似对象比美。
Array.Sort(arrCls6);
}
}
3.IComparer接口定义:比较两个对象的通用方法
public interface IComparer
{
int Compare(object o1, object o2);
}
4.示例
public class MyClass7 : IComparer //使用辅助类
{
public int Id { get; set; }
public string Name { get; set; }
public int Compare(object x, object y)
{
MyClass6 tpX = x as MyClass6;
MyClass6 tpY = y as MyClass6;
if (tpX != null && tpY != null)
{
return string.Compare(tpX.Name, tpY.Name);
}
else
throw new ArgumentNullException("null ....");
}
}
使用
....
private void Func2()
{
MyClass6[] arrCls6 = new MyClass6[4];
arrCls6[0] = new MyClass6 { Id = 1, Name = "aaaa" };
arrCls6[1] = new MyClass6 { Id = 2, Name = "bbbb" };
arrCls6[2] = new MyClass6 { Id = 3, Name = "cccc" };
arrCls6[3] = new MyClass6 { Id = 4, Name = "dddd" };
Array.Sort(arrCls6, new MyClass7());
}