<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .Net集合排序的一種高級玩法實例教程

        來源:懂視網 責編:小采 時間:2020-11-27 22:35:00
        文檔

        .Net集合排序的一種高級玩法實例教程

        .Net集合排序的一種高級玩法實例教程:前言 本文主要介紹了關于.Net集合排序的另一種高級玩法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考學習,下面話不多說了,來一起看看詳細的介紹吧 背景: 學生有名稱、學號, 班級有班級名稱、班級序號 學校有學校名稱、學校編號(序號) 需求
        推薦度:
        導讀.Net集合排序的一種高級玩法實例教程:前言 本文主要介紹了關于.Net集合排序的另一種高級玩法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考學習,下面話不多說了,來一起看看詳細的介紹吧 背景: 學生有名稱、學號, 班級有班級名稱、班級序號 學校有學校名稱、學校編號(序號) 需求

        前言

        本文主要介紹了關于.Net集合排序的另一種高級玩法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考學習,下面話不多說了,來一起看看詳細的介紹吧

        背景:

        學生有名稱、學號,

        班級有班級名稱、班級序號

        學校有學校名稱、學校編號(序號)

        需求 

        現在需要對學生進行排序

        第一排序邏輯

      1. 按學校編號(序號)排列
      2. 再按班級序號排列
      3. 再按學生學號排列
      4. 當然,在我們錄入數據庫信息的時候,有的人可能比較懶,沒有錄入 學校的序號, 班級的序號,學生的學號 ,怎么辦?  那么就Plan B  ! 

        第二排序邏輯

      5. 按學校名稱排列
      6. 再按班級的名稱排列
      7. 再按學生名稱排列
      8. 我編寫了學校、班級、學生的實體關系代碼如下: 

        namespace Sort
        {
         public class School
         {
         public int? Order { get; set; }
         public string Name { get; set; }
         }
        
         public class Class
         {
         public int? Order { get; set; }
         public string Name { get; set; }
         public School School { get; set; }
         }
        
         public class Student
         {
         public int? Order { get; set; }
         public string Name { get; set; }
         public Class Class { get; set; }
        
         }
        }

        以前寫的簡單排序,還可以用OrderBy解決,如果之前寫過的一篇文章:

        《.Net中集合排序還可以這么玩》

        但是這里的排序就比較復雜了,用簡單的OrderBy恐怕是解決不了了。

        Sort

        .Net中,對List集合,有一個Sort字方法,讓我們選中Sort方法,F12,看看Sort方法長哪樣?

         

        可以看到Sort方法一共有四個重載,我們挑最基礎的一個,Sort()  0參數的這個,懂了這個,其他幾個應該也會懂了,我們看看該方法的描述:

         

        雖然我英語不太好,但是這基礎的英語還是能看懂,大致是說:

        用默認的比較器對該List進行排序。

        那么,這個Comparer(比較器)是什么呢?

        IComparable接口

        其實,它是接口IComparable下的一個方法,也就是說只有實現了ICoparable接口下的這個叫比較器的方法才能使用Sort進行排序,我們F12進入到IComparable來看看這個接口:

         

        可以看到,該接口只有一個CompareTo方法,我用我蹩腳的英語大致看懂了這句話的意思是:

        定義一個比較方法來對制定類型進行排序。

        該方法返回類型為Int類型。通過查找查找相關資料,了解到其返回值與其含義如下:

        含義

        復數

        該實例比傳入的Other實例小。

        0

        該實例與傳入的Other實例相等。

        正數

        該實例比傳入的Other實例大。

        知道了這個原則,我們就可以給Student類繼承并實現該方法了。

        對文章開頭的排序需求,我們重溫一下:

        第一排序邏輯(Int?)

      9. 按學校編號(序號)排列
      10. 再按班級序號排列
      11. 再按學生學號排列
      12. 當序號為空時,用第二種排序邏輯,

        第二排序邏輯(String)

      13. 按學校名稱排列
      14. 再按班級的名稱排列
      15. 再按學生名稱排列
      16. 其實無非就是對Student中涉及到的Int?和string兩種數據類型進行比較。

        Int?類型(Nullable)和string已經實現了Compare方法,其中Nullable的如下:

        但是為了能更深入地理解該方法的使用,我自己來寫一個Int?類型數據比較的方法,如下:

        private int CompareInit(int? x, int? y)
         {
         if (x == null && y == null) //如果都是空 那么返回0相等
         return 0;
        
         if (x.HasValue && y == null) //如果傳入X有值,但是Y是空的,那么X比Y小 返回-1。
         return -1;
        
         if (x == null && y.HasValue) //如果傳入X為空,但是Y有值,那么X比Y大 返回1。
         return 1;
        
         if (x.Value > y.Value)
         return 1;
        
         if (x.Value < y.Value)
         return -1;
        
         return 0; //否則兩個數相等
         }

        其中,為什么我認為有值的比Null的還小返回-1呢? 因為我想把Null的往后排,把有值的往前排,其他流行的做法是認為有值的是比Null大的,即返回1,大家可以結合自己的業務需求選擇。

        寫好了Int?類型數據比較的方法,還有String類型數據的比較,我就不自己造輪子去寫了,用現成的String.CompareOrdinal()方法。

        然后,我們開始給Student實現ICompare接口的CompareTo方法,如下:

        public class Student : IComparable<Student>
         {
         public int? Order { get; set; }
         public string Name { get; set; }
         public Class Class { get; set; }
         public int CompareTo(Student other)
         {
         if (ReferenceEquals(this, other)) return 0; //如果兩個值的引用相同,那么直接返回相等。
         if (ReferenceEquals(null, other)) return 1; //如果該實例是空的,但是傳入的實例不是空的,那么返回1
         //比較學校的序號
         var compareResult = CompareInit(this.Class.School.Order, other.Class.School.Order);
         if (compareResult != 0) return compareResult;
         //比較班級的序號
         compareResult = CompareInit(this.Class.Order, other.Class.Order);
         if (compareResult != 0) return compareResult;
         //比較學生的學號
         compareResult = CompareInit(this.Order, other.Order);
         if (compareResult != 0) return compareResult;
         //如果以上還未區分出大小,比較學校的名稱
         compareResult = String.CompareOrdinal(this.Class.School.Name, other.Class.School.Name);
         if (compareResult != 0) return compareResult;
         //比較班級的名稱
         compareResult = String.CompareOrdinal(this.Class.Name, other.Class.Name);
         if (compareResult != 0) return compareResult;
         //比較學生的名稱
         return String.CompareOrdinal(this.Name, other.Name);
        
         }

        實現該方法后,就可以對List<Student> 使用Sort方法了,我們來試試看。

        using System;
        using System.Collections.Generic;
        
        namespace Sort
        {
         class Program
         {
         static void Main(string[] args)
         {
         var students = InitData();
         students.Sort(); //此處執行了Sort方法
         Console.WriteLine("Name-Order");
         foreach (var student in students)
         {
         Console.WriteLine($"學校:{student.Class.School.Name}-{student.Class.School.Order}>>班級:{student.Class.Name}-{student.Class.Order}>>學生:{student.Name}-{student.Order}");
         }
        
         Console.ReadLine();
         }
        
         static List<Student> InitData() //創建數據
         {
         var school1 = new School()
         {
         Order = 1,
         Name = "A",
        
         };
         var school2 = new School
         {
         Name = "B",
         Order = 0
         };
        
         var class1 = new Class
         {
         Order = 1,
         Name = "1",
         School = school1,
         };
        
         var class2 = new Class
         {
         Order = 2,
         Name = "2",
         School = school1,
         };
        
         var class3 = new Class
         {
         Order = 1,
         Name = "1",
         School = school2,
         };
        
         var student1 = new Student
         {
         Order = 1,
         Name = "1",
         Class = class1,
         };
        
         var student2 = new Student
         {
         Order = 2,
         Name = "2",
         Class = class1,
         };
        
         var student3 = new Student
         {
         Order = 3,
         Name = "3",
         Class = class1,
         };
        
         var student4 = new Student
         {
         Order = 1,
         Name = "1",
         Class = class2,
         };
        
         var student5 = new Student
         {
         Order = 1,
         Name = "1",
         Class = class3,
         };
         return new List<Student> { student5, student3, student4, student2, student1 };
        
         }
         }
        }

        執行效果如下:

         

        可以看到,學校B雖然是以B開頭,但是因為期Order為0比1更靠前,所以以Order為準,學校B排到了最前面。

        好幾天沒寫了,寫博客對我我而言,意義無非在于加深印象同時把我所掌握的東西分享給大家,這個方法是今天同事教我的,可能對園子里大神來說這比較基礎,但是相信如果掌握這個方法,對以后也許中復雜排序會有比較有用,希望對大家也能有所幫助。

        項目的GitHub地址:

        https://github.com/liuzhenyulive/Sort (本地下載)

        總結

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .Net集合排序的一種高級玩法實例教程

        .Net集合排序的一種高級玩法實例教程:前言 本文主要介紹了關于.Net集合排序的另一種高級玩法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考學習,下面話不多說了,來一起看看詳細的介紹吧 背景: 學生有名稱、學號, 班級有班級名稱、班級序號 學校有學校名稱、學校編號(序號) 需求
        推薦度:
        標簽: 排序 集合 示例
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一级大黄美女免费播放| 色综合久久精品亚洲国产| 三级黄色片免费看| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲av无一区二区三区| 国产高清视频在线免费观看| 亚洲av综合av一区二区三区| 日韩在线天堂免费观看| 相泽南亚洲一区二区在线播放| 日韩黄色免费观看| 欧洲美女大片免费播放器视频| 免费a级毛片18以上观看精品| 美女羞羞免费视频网站| 亚洲欧洲日本在线| a级毛片毛片免费观看永久| 亚洲av福利无码无一区二区| 最近中文字幕免费mv在线视频| 亚洲人妖女同在线播放| 好男人视频在线观看免费看片| 午夜亚洲WWW湿好爽| 中文亚洲成a人片在线观看| 国产精品九九久久免费视频 | 亚洲 日韩 色 图网站| 午夜影视在线免费观看| 污视频网站在线免费看| 亚洲乱码中文字幕久久孕妇黑人| 一个人免费视频观看在线www| 亚洲天天做日日做天天欢毛片| 中文字幕av无码无卡免费| 理论秋霞在线看免费| 国产精品亚洲片在线观看不卡| 18禁免费无码无遮挡不卡网站 | a级在线免费观看| 4444亚洲国产成人精品| 超pen个人视频国产免费观看| 一级特黄a免费大片| 亚洲综合久久1区2区3区| 日韩免费观看的一级毛片| 91视频免费观看| 久久狠狠爱亚洲综合影院| 亚洲人成影院在线观看|