码迷,mamicode.com
首页 > 编程语言 > 详细

c#之数组

时间:2014-12-05 18:48:46      阅读:187      评论:0      收藏:0      [点我收藏+]

标签: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();

bubuko.com,布布扣

利用IComparer<T>灵活的选择排序条件

在上面我们利用了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的第二个参数来选择进行排序的规则了

 

Foreach使用IEnumerator实现迭代

IEumerable实现了GetEnmerator方法,该方法返回一个实现IEumerable的接口枚举,不过真正实现的是IEumerable接口中的方法和属性

Current:返回光标所在的元素

MoveNext():移动到集合的下一个元素上,如果有元素则返回true

当然该接口还实现了IDisposable和reset方法

 

利用yield语句来创建枚举器

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();

c#之数组

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/ilooking/p/4147128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!