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

Tulip123發表於2020-11-14

一、泛型集合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();

結果如下:

 

 

 

今天的分享就到這裡了,好久沒寫過部落格了,加班多,太忙了,抽空複習一下基礎知識;

相關文章