C# 泛型集合的自定義類型排序


一、泛型集合List<T>排序

經sort方法之后,采用了升序的方式進行排列的。

            List<int> list = new List<int>() { 2, 4, 1, 3, 5, -2, 0, 10 };
            Console.Write("排序前...");
            foreach (var item in list)
            {
                Console.Write(item + "\t");
            }
            list.Sort();
            Console.WriteLine();
            Console.WriteLine("排序后...");
            foreach (var item in list)
            {
                Console.Write(item + "\t");
            }

二、對自定義類型進行排序

定義一個普通類:

public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

接下來,將定義的Person實例化,排序;

 List<Person> list = new List<Person>() {
                new Person(){Name="張叄",Id=1},
                new Person() {Name="李四",Id=4 },
                 new Person() {Name="王五",Id=2 },
            };
            list.Sort();
            foreach (var item in list)
            {
                Console.Write(item.Id);
            }

結果如下:

 

 

 

在int類型中實現了IComparable,所以可以通過Sort()直接排序;

 

 

 

int類型是實現了IComparable這個接口的。那么如果讓自定義類型Person也可以排序,那么試試實現該接口;

 那么將上面的代碼修改一下看看

  public class Person:IComparable
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public int CompareTo(object obj)
        {
            Person p = obj as Person;
            return this.Id.CompareTo(p.Id);
        }
    }

結果如下:

 

 

 三、對集合按照多種不同規則進行排序

實際使用中,經常需要對集合按照多種不同規則進行排序,這就需要定義其他比較規則,可以在Compare方法中定義,該方法屬於IComparer<T>泛型接口,請看下面的代碼:

public class PersonNameDesc : IComparer<Person>
    {
        //存放排序器實例
        public static PersonNameDesc NameDesc = new PersonNameDesc();
        public int Compare(Person x, Person y)
        {
            return System.Collections.Comparer.Default.Compare(x.Name, y.Name);
        }
    }

Compare方法的參數為要進行比較的兩個同類型對象,返回值為int類型,返回值處理規則與CompareTo方法相同。其中的Comparer.Default返回一個內置的Comparer對象,用於比較兩個同類型對象。

    下面用新定義的這個比較器對集合進行排序:

 //================對集合按照多種不同規則進行排序=========================
            List< Person > list = new List<Person>() {
                new Person(){Name="張叄",Id=1},
                new Person() {Name="李四",Id=4 },
                 new Person() {Name="王五",Id=2 },
                  new Person() {Name="李四",Id=6 },
                 new Person() {Name="王五",Id=3 },
            };
            list.Sort(PersonNameDesc.NameDesc);
            foreach (var item in list)
            {
                Console.Write(item.Name + "\t");
            }
            Console.Read();

結果如下:

 

 

 四、使用linq進行排序

sort方法的一個重載是Comparison<T>類型的參數;

那就看一下 Comparison<T>是怎么一回事吧:

 List<Person> list = new List<Person>()
            {
                new Person(){Name="張叄",Id=1},
                new Person() {Name="李四",Id=4 },
                new Person() {Name="王五",Id=2 },
                new Person() {Name="李四",Id=6 },
                new Person() {Name="王五",Id=3 },
            };
            //匿名委托
            list.Sort((a, b) => a.Id - b.Id);
            foreach (Person p in list)
            {
                Console.WriteLine(p.Name + "\t" + p.Id);
            }
            Console.Read();

結果如下:

 

 

  List<Person> list = new List<Person>()
            {
                new Person(){Name="張叄",Id=1},
                new Person() {Name="李四",Id=4 },
                new Person() {Name="王五",Id=2 },
                new Person() {Name="李四",Id=6 },
                new Person() {Name="王五",Id=3 },
            };
            var l = from p in list
                    orderby p.Id descending
                    select p;
            foreach (Person p in l)
            {
                Console.WriteLine(p.Name + "\t" + p.Id);
            }
            Console.Read();

結果如下:

 

 

 

今天的分享就到這里了,好久沒寫過博客了,加班多,太忙了,抽空復習一下基礎知識;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM