标签:style blog http io ar color os 使用 sp
自定义类来实现排序功能
利用Array的sort方法来进行排序,但是sort方法需要数组中的元素实现IComparable,就可以通过自定义这些类型的排序
接下来我们对定义的person类数组进行自定义的排序准则,实现Icomparable接口中的ComparaTo()方法,如果要比较的对象相等,改方法返回0,如果该实例应该排在参数对象的前面,该方法就返回小于0的值,如果该实例应该排在参数对象的后面,该方法就返回大于0的值
public class Person :IComparable<Person> { public string LastName { get; set; } public string FirstName { get; set; } public int CompareTo(Person other) { if (other == null) { throw new ArgumentNullException("Index"); } int result = this.LastName.CompareTo(other.LastName); if (result == 0) { result = this.FirstName.CompareTo(other.FirstName); } return result; } }
定义的这段代码的意思是先根据Person的LastName来做比较,如果LastName相同即result相同的情况下再根据在根据FisrtName进行排序
Person[] persons ={ new Person{FirstName="Damon",LastName="dHill"}, new Person{FirstName="Nii",LastName="cLauda"}, new Person{FirstName="Ayrton",LastName="bSena"}, new Person{FirstName="Graham",LastName="aHill"} }; Array.Sort(persons); foreach (var p in persons) { Console.WriteLine(p.LastName); } Console.Read();
在上面我们利用了IComparable<T>接口来自定义person的排序条件,重写IComparable<T>中的Comparable方法的时候我们为其中定义了数组是先根据LastName来进行排序后在根据FirstName来进行排序,但是如果以后Perosn中多了一个Id的属性,我们想来通过Id属性来进行排序的话,就必须重新修改其中的逻辑代码。所以我们可以通过IComparer<T>的泛型接口来实现,并且通过枚举的方法来选择进行排序的规则
public enum PersonCompareType { FirstName, LastName } public class PersonComparer:IComparer<Person> { private PersonCompareType compareType; public PersonComparer(PersonCompareType compareType) { this.compareType = compareType; } public int Compare(Person x, Person y) { if (x == null) { throw new ArgumentNullException("x"); } if (y == null) { throw new ArgumentNullException("y"); } switch (compareType) { case PersonCompareType.FirstName: return x.FirstName.CompareTo(y.FirstName); case PersonCompareType.LastName: return x.LastName.CompareTo(y.LastName); default: throw new ArgumentException("unexpected compare type"); } //int result= x.LastName.CompareTo(y.LastName); //if (result == 0) { // result = x.FirstName.CompareTo(y.FirstName); //} //return result; } }
Array.Sort(persons,new PersonComparer(PersonCompareType.LastName)); foreach (var p in persons) { Console.WriteLine(p.LastName); }
这样子我们就可通过更改Array.Sort的第二个参数来选择进行排序的规则了
IEumerable实现了GetEnmerator方法,该方法返回一个实现IEumerable的接口枚举,不过真正实现的是IEumerable接口中的方法和属性
Current:返回光标所在的元素
MoveNext():移动到集合的下一个元素上,如果有元素则返回true
当然该接口还实现了IDisposable和reset方法
yield return :返回集合的第一个元素,并移动到下一个元素上
yield break:可停止迭代
包含yied的迭代快必须返回IEnumerator或IEnumerable接口
可以看做yield类实现了IEnumerator和IDisposable接口的属性和方法
public IEnumerator<string> GetEnumerator() { yield return "Hello"; yield return "World"; }
var helloCollection = new HelloCollection(); foreach (var s in helloCollection) { Console.WriteLine(s); } Console.Read();
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/ilooking/p/4147128.html