国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題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關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

.Net集合排序的一種高級(jí)玩法實(shí)例教程

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:35:00
文檔

.Net集合排序的一種高級(jí)玩法實(shí)例教程

.Net集合排序的一種高級(jí)玩法實(shí)例教程:前言 本文主要介紹了關(guān)于.Net集合排序的另一種高級(jí)玩法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 背景: 學(xué)生有名稱(chēng)、學(xué)號(hào), 班級(jí)有班級(jí)名稱(chēng)、班級(jí)序號(hào) 學(xué)校有學(xué)校名稱(chēng)、學(xué)校編號(hào)(序號(hào)) 需求
推薦度:
導(dǎo)讀.Net集合排序的一種高級(jí)玩法實(shí)例教程:前言 本文主要介紹了關(guān)于.Net集合排序的另一種高級(jí)玩法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 背景: 學(xué)生有名稱(chēng)、學(xué)號(hào), 班級(jí)有班級(jí)名稱(chēng)、班級(jí)序號(hào) 學(xué)校有學(xué)校名稱(chēng)、學(xué)校編號(hào)(序號(hào)) 需求

前言

本文主要介紹了關(guān)于.Net集合排序的另一種高級(jí)玩法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

背景:

學(xué)生有名稱(chēng)、學(xué)號(hào),

班級(jí)有班級(jí)名稱(chēng)、班級(jí)序號(hào)

學(xué)校有學(xué)校名稱(chēng)、學(xué)校編號(hào)(序號(hào))

需求 

現(xiàn)在需要對(duì)學(xué)生進(jìn)行排序

第一排序邏輯

  • 按學(xué)校編號(hào)(序號(hào))排列
  • 再按班級(jí)序號(hào)排列
  • 再按學(xué)生學(xué)號(hào)排列
  • 當(dāng)然,在我們錄入數(shù)據(jù)庫(kù)信息的時(shí)候,有的人可能比較懶,沒(méi)有錄入 學(xué)校的序號(hào), 班級(jí)的序號(hào),學(xué)生的學(xué)號(hào) ,怎么辦?  那么就Plan B  ! 

    第二排序邏輯

  • 按學(xué)校名稱(chēng)排列
  • 再按班級(jí)的名稱(chēng)排列
  • 再按學(xué)生名稱(chēng)排列
  • 我編寫(xiě)了學(xué)校、班級(jí)、學(xué)生的實(shí)體關(guān)系代碼如下: 

    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; }
    
     }
    }

    以前寫(xiě)的簡(jiǎn)單排序,還可以用OrderBy解決,如果之前寫(xiě)過(guò)的一篇文章:

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

    但是這里的排序就比較復(fù)雜了,用簡(jiǎn)單的OrderBy恐怕是解決不了了。

    Sort

    .Net中,對(duì)List集合,有一個(gè)Sort字方法,讓我們選中Sort方法,F(xiàn)12,看看Sort方法長(zhǎng)哪樣?

     

    可以看到Sort方法一共有四個(gè)重載,我們挑最基礎(chǔ)的一個(gè),Sort()  0參數(shù)的這個(gè),懂了這個(gè),其他幾個(gè)應(yīng)該也會(huì)懂了,我們看看該方法的描述:

     

    雖然我英語(yǔ)不太好,但是這基礎(chǔ)的英語(yǔ)還是能看懂,大致是說(shuō):

    用默認(rèn)的比較器對(duì)該List進(jìn)行排序。

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

    IComparable接口

    其實(shí),它是接口IComparable下的一個(gè)方法,也就是說(shuō)只有實(shí)現(xiàn)了ICoparable接口下的這個(gè)叫比較器的方法才能使用Sort進(jìn)行排序,我們F12進(jìn)入到IComparable來(lái)看看這個(gè)接口:

     

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

    定義一個(gè)比較方法來(lái)對(duì)制定類(lèi)型進(jìn)行排序。

    該方法返回類(lèi)型為Int類(lèi)型。通過(guò)查找查找相關(guān)資料,了解到其返回值與其含義如下:

    含義

    復(fù)數(shù)

    該實(shí)例比傳入的Other實(shí)例小。

    0

    該實(shí)例與傳入的Other實(shí)例相等。

    正數(shù)

    該實(shí)例比傳入的Other實(shí)例大。

    知道了這個(gè)原則,我們就可以給Student類(lèi)繼承并實(shí)現(xiàn)該方法了。

    對(duì)文章開(kāi)頭的排序需求,我們重溫一下:

    第一排序邏輯(Int?)

  • 按學(xué)校編號(hào)(序號(hào))排列
  • 再按班級(jí)序號(hào)排列
  • 再按學(xué)生學(xué)號(hào)排列
  • 當(dāng)序號(hào)為空時(shí),用第二種排序邏輯,

    第二排序邏輯(String)

  • 按學(xué)校名稱(chēng)排列
  • 再按班級(jí)的名稱(chēng)排列
  • 再按學(xué)生名稱(chēng)排列
  • 其實(shí)無(wú)非就是對(duì)Student中涉及到的Int?和string兩種數(shù)據(jù)類(lèi)型進(jìn)行比較。

    Int?類(lèi)型(Nullable)和string已經(jīng)實(shí)現(xiàn)了Compare方法,其中Nullable的如下:

    但是為了能更深入地理解該方法的使用,我自己來(lái)寫(xiě)一個(gè)Int?類(lèi)型數(shù)據(jù)比較的方法,如下:

    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; //否則兩個(gè)數(shù)相等
     }

    其中,為什么我認(rèn)為有值的比Null的還小返回-1呢? 因?yàn)槲蚁氚袾ull的往后排,把有值的往前排,其他流行的做法是認(rèn)為有值的是比Null大的,即返回1,大家可以結(jié)合自己的業(yè)務(wù)需求選擇。

    寫(xiě)好了Int?類(lèi)型數(shù)據(jù)比較的方法,還有String類(lèi)型數(shù)據(jù)的比較,我就不自己造輪子去寫(xiě)了,用現(xiàn)成的String.CompareOrdinal()方法。

    然后,我們開(kāi)始給Student實(shí)現(xiàn)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; //如果兩個(gè)值的引用相同,那么直接返回相等。
     if (ReferenceEquals(null, other)) return 1; //如果該實(shí)例是空的,但是傳入的實(shí)例不是空的,那么返回1
     //比較學(xué)校的序號(hào)
     var compareResult = CompareInit(this.Class.School.Order, other.Class.School.Order);
     if (compareResult != 0) return compareResult;
     //比較班級(jí)的序號(hào)
     compareResult = CompareInit(this.Class.Order, other.Class.Order);
     if (compareResult != 0) return compareResult;
     //比較學(xué)生的學(xué)號(hào)
     compareResult = CompareInit(this.Order, other.Order);
     if (compareResult != 0) return compareResult;
     //如果以上還未區(qū)分出大小,比較學(xué)校的名稱(chēng)
     compareResult = String.CompareOrdinal(this.Class.School.Name, other.Class.School.Name);
     if (compareResult != 0) return compareResult;
     //比較班級(jí)的名稱(chēng)
     compareResult = String.CompareOrdinal(this.Class.Name, other.Class.Name);
     if (compareResult != 0) return compareResult;
     //比較學(xué)生的名稱(chēng)
     return String.CompareOrdinal(this.Name, other.Name);
    
     }

    實(shí)現(xiàn)該方法后,就可以對(duì)List<Student> 使用Sort方法了,我們來(lái)試試看。

    using System;
    using System.Collections.Generic;
    
    namespace Sort
    {
     class Program
     {
     static void Main(string[] args)
     {
     var students = InitData();
     students.Sort(); //此處執(zhí)行了Sort方法
     Console.WriteLine("Name-Order");
     foreach (var student in students)
     {
     Console.WriteLine($"學(xué)校:{student.Class.School.Name}-{student.Class.School.Order}>>班級(jí):{student.Class.Name}-{student.Class.Order}>>學(xué)生:{student.Name}-{student.Order}");
     }
    
     Console.ReadLine();
     }
    
     static List<Student> InitData() //創(chuàng)建數(shù)據(jù)
     {
     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 };
    
     }
     }
    }

    執(zhí)行效果如下:

     

    可以看到,學(xué)校B雖然是以B開(kāi)頭,但是因?yàn)槠贠rder為0比1更靠前,所以以O(shè)rder為準(zhǔn),學(xué)校B排到了最前面。

    好幾天沒(méi)寫(xiě)了,寫(xiě)博客對(duì)我我而言,意義無(wú)非在于加深印象同時(shí)把我所掌握的東西分享給大家,這個(gè)方法是今天同事教我的,可能對(duì)園子里大神來(lái)說(shuō)這比較基礎(chǔ),但是相信如果掌握這個(gè)方法,對(duì)以后也許中復(fù)雜排序會(huì)有比較有用,希望對(duì)大家也能有所幫助。

    項(xiàng)目的GitHub地址:

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

    總結(jié)

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    .Net集合排序的一種高級(jí)玩法實(shí)例教程

    .Net集合排序的一種高級(jí)玩法實(shí)例教程:前言 本文主要介紹了關(guān)于.Net集合排序的另一種高級(jí)玩法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧 背景: 學(xué)生有名稱(chēng)、學(xué)號(hào), 班級(jí)有班級(jí)名稱(chēng)、班級(jí)序號(hào) 學(xué)校有學(xué)校名稱(chēng)、學(xué)校編號(hào)(序號(hào)) 需求
    推薦度:
    標(biāo)簽: 排序 集合 示例
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專(zhuān)題
    Top
    主站蜘蛛池模板: 91久久精品国产91久久性色也 | 精品国产日韩一区三区 | 成人久久久久久 | 国产亚洲精品sese在线播放 | 成人精品视频一区二区在线 | 国产高清视频 | 免费看全黄特黄毛片 | 午夜日本一区二区三区 | 亚洲欧美色视频 | 国内精品线在线观看 | 国产乱了真实在线观看 | 国产麻豆自拍 | 亚洲国产视频网 | 国产视频高清在线观看 | 国产成人一区二区三区小说 | 国内精品视频在线播放 | 国产日韩欧美精品 | 国产精品久久久久9999 | 夜夜骑首页 | 91久久综合九色综合欧美98 | 亚洲欧洲第一页 | 国产精品第一 | 国产成人久久蜜一区二区 | 日韩免费高清视频 | 欧美一区二区三区视视频 | 亚洲欧美视频在线观看 | 国产欧美日韩va | 91欧美亚洲 | h片免费在线观看 | 91麻豆免费观看 | 国产综合精品一区二区 | 国产视频播放 | 美日韩一区二区三区 | 日韩欧美精品 | 在线播放一区二区三区 | 日韩伦理网| 国产不卡视频在线 | 亚洲国产成人精品一区91 | 99精品高清视频一区二区 | 国产精品视频a | 欧美日韩一 |