zoukankan      html  css  js  c++  java
  • c#之数组

    自定义类来实现排序功能

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

    image

    利用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();
  • 相关阅读:
    后缀数组 POJ 3693 Maximum repetition substring
    后缀数组 POJ 2406 Power Strings
    后缀数组 SPOJ 694 Distinct Substrings
    后缀数组 POJ 3261 Milk Patterns
    后缀数组 POJ 1743 Musical Theme
    后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
    后缀数组 POJ 2217 Secretary
    Codeforces Round #349
    后缀数组 POJ 3581 Sequence
    Codeforces Round #348(VK Cup 2016
  • 原文地址:https://www.cnblogs.com/ilooking/p/4147128.html
Copyright © 2011-2022 走看看