日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C#對(duì)集合進(jìn)行排序_C#教程

作者:.NET開發(fā)菜鳥 ? 更新時(shí)間: 2022-05-11 編程語言

先來看看下面List泛型集合的排序例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
    class Program
    {
        static void Main(string[] args)
        {
            List list = new List();
            list.Add(1);
            list.Add(5);
            list.Add(2);
            list.Add(6);
            list.Add(3);
            list.Add(4);
            Console.WriteLine("*****排序前*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.ToString());
            }

            list.Sort();
            Console.WriteLine("*****排序后*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.ToString());
            }

            Console.ReadKey();
        }
    }
}

輸出結(jié)果:

從上面的截圖中可以看出,Sort()方法默認(rèn)按照元素的大小進(jìn)行從小到大的排序,為什么調(diào)用Sort()方法就能按照元素的大小進(jìn)行從小到大的排序呢?其實(shí)現(xiàn)原理是什么呢?我們能不能自定義排序規(guī)則呢?帶著這些問題,我們先來看看Sort()方法的定義,在Sort()方法上面按F12轉(zhuǎn)到定義:

從截圖中可以看出,Sort()方法使用了幾個(gè)重載的方法。可以傳遞給它的參數(shù)有泛型委托Comparison comparison和泛型接口IComparer comparer,以及一個(gè)范圍值和泛型接口IComparer comparer。只有集合中的元素實(shí)現(xiàn)了IComparable接口,才能使用不帶參數(shù)的Sort()方法。我們?cè)谶@里實(shí)現(xiàn)IComparer接口來創(chuàng)建一個(gè)自定義類型的排序功能。

1、定義一個(gè)Student類,包括姓名和分?jǐn)?shù)兩個(gè)屬性,可以按照姓名或分?jǐn)?shù)進(jìn)行排序,Student類定義如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   public class Student
    {
        public string Name { get; set; }

        public double Score { get; set; }
    }
}

2、在定義一個(gè)枚舉,表示排序的種類,即是按照Name排序還是按照Score排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
    /// 
    /// 排序的種類
    /// 
   public enum CompareType
    {
        Name,
        Score
    }
}

3、實(shí)現(xiàn)IComparer接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
    /// 
    /// StudentComparer自定義排序規(guī)則類實(shí)現(xiàn)IComparable接口
    /// 
    public class StudentComparer : IComparer
    {
        private CompareType _compareType;

        /// 
        /// 通過構(gòu)造函數(shù)給_compareType賦值
        /// 
        /// 
        public StudentComparer(CompareType compareType)
        {
            _compareType = compareType;
        }

        /// 
        /// 實(shí)現(xiàn)IComparer接口的Compare
        /// 
        /// 
        /// 
        public int Compare(Student x, Student y)
        {
            if (x == null && y == null)
            {
                return 0;
            }
            if (x == null)
            {
                return -1;
            }
            if (y == null)
            {
                return 1;
            }
            switch (_compareType)
            {
                case CompareType.Name:
                    return string.Compare(x.Name, y.Name);
                    break;
                case CompareType.Score:
                    return x.Score.CompareTo(y.Score);
                    break;
                default:
                    throw new ArgumentException("無效的比較類型");
            }
        }
    }
}

4、在Main()方法中調(diào)用:

先按照Name進(jìn)行排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
    class Program
    {
        static void Main(string[] args)
        {
            //List list = new List();
            //list.Add(1);
            //list.Add(5);
            //list.Add(2);
            //list.Add(6);
            //list.Add(3);
            //list.Add(4);
            //Console.WriteLine("*****排序前*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.ToString());
            //}

            //list.Sort();
            //Console.WriteLine("*****排序后*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.ToString());
            //}


            List list = new List()
            {
                new Student()
                {
                    Name="Tom",
                    Score=98
                } ,
                new Student()
                {
                    Name="Kevin",
                    Score=69
                } ,
                new Student()
                {
                    Name="Leo",
                    Score=81
                }
            };
            Console.WriteLine("*****排序前*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.Name);
            }
            list.Sort(new StudentComparer(CompareType.Name));
            Console.WriteLine("*****排序后*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.Name);
            }

            //Console.WriteLine("***按照Score排序***");

            Console.ReadKey();
        }
    }
}

?結(jié)果:

在按照Score進(jìn)行排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
    class Program
    {
        static void Main(string[] args)
        {
            //List list = new List();
            //list.Add(1);
            //list.Add(5);
            //list.Add(2);
            //list.Add(6);
            //list.Add(3);
            //list.Add(4);
            //Console.WriteLine("*****排序前*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.ToString());
            //}

            //list.Sort();
            //Console.WriteLine("*****排序后*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.ToString());
            //}


            List list = new List()
            {
                new Student()
                {
                    Name="Tom",
                    Score=98
                } ,
                new Student()
                {
                    Name="Kevin",
                    Score=69
                } ,
                new Student()
                {
                    Name="Leo",
                    Score=81
                }
            };
            //Console.WriteLine("*****排序前*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.Name);
            //}
            //list.Sort(new StudentComparer(CompareType.Name));
            //Console.WriteLine("*****排序后*****");
            //foreach (var item in list)
            //{
            //    Console.WriteLine(item.Name);
            //}

            Console.WriteLine("*****排序前*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.Score);
            }
            list.Sort(new StudentComparer(CompareType.Name));
            Console.WriteLine("*****排序后*****");
            foreach (var item in list)
            {
                Console.WriteLine(item.Score);
            }

            Console.ReadKey();
        }
    }
}

結(jié)果:

原文鏈接:https://www.cnblogs.com/dotnet261010/p/9278851.html

欄目分類
最近更新