一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - .Net集合排序的一種高級玩法實(shí)例教程

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

2020-05-26 14:40碼農(nóng)阿宇 ASP.NET教程

這篇文章主要給大家介紹了關(guān)于.Net集合排序的一種高級玩法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

背景:

學(xué)生有名稱、學(xué)號,

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

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

需求 

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

第一排序邏輯

  • 按學(xué)校編號(序號)排列
  • 再按班級序號排列
  • 再按學(xué)生學(xué)號排列

當(dāng)然,在我們錄入數(shù)據(jù)庫信息的時候,有的人可能比較懶,沒有錄入 學(xué)校的序號, 班級的序號,學(xué)生的學(xué)號 ,怎么辦?  那么就Plan B  ! 

第二排序邏輯

  • 按學(xué)校名稱排列
  • 再按班級的名稱排列
  • 再按學(xué)生名稱排列

我編寫了學(xué)校、班級、學(xué)生的實(shí)體關(guān)系代碼如下: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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中集合排序還可以這么玩》

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

Sort

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

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

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

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

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

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

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

IComparable接口

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

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

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

定義一個比較方法來對制定類型進(jìn)行排序。

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

 

含義

復(fù)數(shù)

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

0

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

正數(shù)

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

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

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

第一排序邏輯(Int?)

  • 按學(xué)校編號(序號)排列
  • 再按班級序號排列
  • 再按學(xué)生學(xué)號排列

當(dāng)序號為空時,用第二種排序邏輯,

第二排序邏輯(String)

  • 按學(xué)校名稱排列
  • 再按班級的名稱排列
  • 再按學(xué)生名稱排列

其實(shí)無非就是對Student中涉及到的Int?和string兩種數(shù)據(jù)類型進(jìn)行比較。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;   //否則兩個數(shù)相等
 }

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

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

然后,我們開始給Student實(shí)現(xiàn)ICompare接口的CompareTo方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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; //如果該實(shí)例是空的,但是傳入的實(shí)例不是空的,那么返回1
   //比較學(xué)校的序號
   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;
   //比較學(xué)生的學(xué)號
   compareResult = CompareInit(this.Order, other.Order);
   if (compareResult != 0) return compareResult;
   //如果以上還未區(qū)分出大小,比較學(xué)校的名稱
   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;
   //比較學(xué)生的名稱
   return String.CompareOrdinal(this.Name, other.Name);
 
  }

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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}>>班級:{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í)行效果如下:

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

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

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

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

https://github.com/liuzhenyulive/Sort

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/CoderAyu/p/9058024.html

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草草影院在线 | 欧美国产在线观看 | 亚洲九九爱 | 亚洲 日本 中文字幕 制服 | 被教官揉了一晚上的奶小说 | 亚洲欧美日韩另类在线一 | 亚洲大爷操 | 韩国三级年轻的小婊孑 | 女人张开腿让男人做爽爽 | 日本另类z0zx高清 | 2022色婷婷综合久久久 | 亚洲一二三区视频 | www.男人天堂 | 午夜欧美精品久久久久久久久 | 男人网站视频 | 日本加勒比在线精品视频 | 日韩乱淫 | 成人黄色免费网站 | 白发在线视频播放观看免费 | 国产拍拍拍 | 国产欧美亚洲精品第一页青草 | 成人伊人青草久久综合网破解版 | 玩逼逼| 国产免费看片 | 五月婷婷丁香色 | 日本视频免费看 | 女人把扒开给男人爽的 | 成年人黄视频在线观看 | 成年美女黄网色大观看全 | 九九九九九九精品免费 | 精品一区二区三区在线成人 | 第一福利在线观看永久视频 | 99在线视频免费 | 91国内在线国内在线播放 | 国产精品va在线观看手机版 | 无毒成人社区 | 国产精品区牛牛影院 | 青青草99热这里都是精品 | 久久re视频精品538在线 | 亚洲精品乱码蜜桃久久久 | 国色天香社区视频免费观看3 |