与C#定义了相等性比较规范一样,C#也定义了排序比较规范,以确定一个对象与另一个对象的先后顺序。排序规范如下IComparable接口(包括IComparable接口和IComparable<T>接口)>和<运算符当需要实现排序算法时,使用ICompara ...
与C#定义了相等性比较规范一样,C#也定义了排序比较规范,以确定一个对象与另一个对象的先后顺序。排序规范如下
- IComparable接口(包括IComparable接口和IComparable<T>接口)
- >和<运算符
当需要实现排序算法时,使用IComparable接口。在下面的例子中,Array.Sort静态方法可以调用,是因为System.String类实现了IComparable接口。
get='_blank'>string[] colors={"Green", "Red", "Blue"};Array.Sort(colors)foreach(string c in colors) Console.Write(c+ " ");
public interface IComparable int CompareTo(Object obj);}public interface IComparable<in T>{ int CompareTo(T other);}
这两个接口定义了相同的功能。对于值类型,IComparable<T>接口效率高于ICompare接口。上面的两个接口的CompareTo方法都按照下面的方式运行:
- 如果a排在b后面,那么a.CompareTo(b)返回1
- 如果a和不一样,那么返回0
- 如果a排在不前面,那么返回-1
我们来看下面的示例代码:
internal struct Note : IComparable, IComparable<Note>, IEquatable<Note>{ private int semitonesFromA; public int SemitonesFromA { get { return semitonesFromA; } } public Note(int semitonesFromA) { this.semitonesFromA = semitonesFromA; } // generic IComparable<T> public int CompareTo(Note other) { if (Equals(other)) return 0; return SemitonesFromA.CompareTo(other.SemitonesFromA); } // non-generic IComaparable public int IComparable.CompareTo(object other) { if (!(other is Note)) throw new InvalidOperationException("CompareTo: Not a note"); return CompareTo((Note)other); } public static bool operator <(Note n1, Note n2) { return n1.CompareTo(n2) < 0; } public static bool operator >(Note n1, Note n2) { return n1.CompareTo(n2) > 0; } // for IEquatable public bool Equals(Note other) { return this.SemitonesFromA == other.SemitonesFromA; } // override Object.Equals public override bool Equals(object other) { if (!(other is Note)) throw new InvalidOperationException("CompareTo: Not a note"); return Equals((Note)other); } public override int GetHashCode() { return SemitonesFromA.GetHashCode(); } public static bool operator ==(Note n1, Note n2) { return n1.Equals(n2); } public static bool operator !=(Note n1, Note n2) { return !(n1 == n2); }}
原标题:C#排序比较
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。