国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - ASP.NET教程 - .Net中的集合排序可以這么玩你知道嗎

.Net中的集合排序可以這么玩你知道嗎

2020-05-25 14:12碼農阿宇 ASP.NET教程

集合為處理大量數據時所用到一種容器類。簡單講就是數據結構算法的具體平臺上的實現。下面這篇文章主要給大家介紹了關于.Net中集合排序的一些你可能不知道的用法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

C#集合類型概述

集合是.NET FCL(Framework Class Library)中很重要的一部分。所有的集合類都繼承自IEnumerable。集合類總體可分為一下幾類:關聯/非關聯型集合,順序/隨機訪問集合,順序/無序集合,泛型/非泛型集合,線程安全集合。

各集合類底層接口關系圖

.Net中的集合排序可以這么玩你知道嗎

背景:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class StockQuantity
 {
 public StockQuantity(string status, DateTime dateTime, int quantity)
 {
  Status = status;
  DateTime = dateTime;
  Quantity = quantity;
 }
 public string Status { get; set; }
 public DateTime DateTime { get; set; }
 public int Quantity { get; set; }
}

該對象,主要有三個字段,現在的業務需求是,取到了一個類型為List<StockQuantity>集合StockQuantities,需要對該集合進行三次排序,排序規則及優先級如下:

1.    Status為空的排在后面,不為空的排在前面,不關心Status的內容,只關心Status是否為空。

2.    DateTime升序排序。

3.    Quantity升序排序。

小白我的做法:

我只知道可以對集合用OderBy排序,對以上三條規則,所以設計思路如下。

1.    StockQuantities.OrderBy(u=>u.Status)

錯誤,

該排序得規則不僅僅會考慮Status是否為空,還會考慮Status的內容。

如果Status是[“b”,”c”,null,”d”] ,那么排序結果是[null,“b”,”c”,”d”]

而我們要的結果是[“b”,”c”,”d” ,null]  (直接把null的丟到最后,別的不動)

怎么辦?

暫時不知道,先不管

2.    對DateTime進行升序排序,這簡單

StockQuantities.OrderBy(u=>u.DateTime)

半對!

為什么半對,看下面

3.    在排序2的前提下,用OrderBy,也就是StockQuantities.OrderBy(u=>u.DateTime).OrderBy(u=>u.Quantity)

錯誤!

以上表達式等同于下面兩條的表達式:

?
1
2
StockQuantities = StockQuantities.OrderBy(u=>u.DateTime)
StockQuantities = StockQuantities.OrderBy(u=>u.Quantity)

所以第一條代碼就是廢代碼,最終排序還是以Quantity進行排序的。

雖然我是小白,但我還是明白這樣是錯誤的,所以我的做法是

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
stockQuantities = stockQuantities.OrderBy(u => u.DateTime).ToList();
  foreach (var dateOrder in stockQuantities)
  {
  var datetimeOrderBy = stockQuantities.Where(u => u.DateTime.Date == dateOrder.DateTime.Date) .OrderBy(u => u.Count);
  foreach (var countOrder in datetimeOrderBy)
  {
   if (countOrder.OutPut == false)
   {
   Console.WriteLine($"{countOrder.Status}-{countOrder.DateTime}-{countOrder.Count}");
   countOrder.OutPut = true;
   }
  }
  }
  Console.ReadKey();

采用雙層循環,先取到按時間排序的數據 dateOrder,再去和該條數據在同一天的所有數據并對Quantity進行排序,為了防止重復的輸出,我同時給StockQuantity對象加上了Output屬性,當該屬性為false為,則輸出該對象的內容,并把Output屬性設為true,這樣就不會重復輸出了,而且實現了先對DateTime排序,再對Quantity進行排序。
So Easy!!

然而,當開心地把這樣的代碼提交之后,卻被同事狠狠地鄙視了,說到:“什么爛代碼啊!”然道還有比這更好的代碼?

給同事倒了一杯茶,點了一根煙,虛心請教。

大佬做法:

同事給我講了兩招,分別是條件排序、多級排序。

什么是條件排序,怎么用?

1.    StockQuantities.OrderBy(u=>u.Status==null)

這就是條件排序,可是咋一看,給人一種是把Status為空的排前面,不為空的排后面的錯覺。

其實不然,我們看到OrderBy里面的一個返回值為bool類型的表達式,該排序先排結果為0(false)的,再排結果為1(true)的。這種排序只考慮返回的bool值,不考慮參數的具體值,所以姑且稱它為條件排序。

完全符合排序規則1的要求。

什么是多級排序,怎么用?

2.    利用我上面我的代碼排序雖然可以實現先排DateTime,再排Quantity,但是該算法的時間復雜度的n*n,而且給StockQuantity添加了output字段,明顯是不科學的。

然而,連續地使用多個OrderBy最終只會生效最后一個OrderBy,天無絕人之路,所以這個時候應該使用ThenBy!!
使用ThenBy可以講以上的三條排序規則簡化如下:

stockQuantities = stockQuantities.OrderBy(u => u.Status==null).ThenBy(u => u.DateTime).ThenBy(u => u.Quantity).ToList();

即可完美地實現再前一個排序前提下進行二級排序。

優化后的完整代碼如下:

?
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
using System;
using System.Collections.Generic;
using System.Linq;
namespace OrderBy
{
 class Program
 {
 static void Main(string[] args)
 {
  var stockQuantities = new List<StockQuantity>()
  {
  new StockQuantity("正常品",new DateTime(2017,4,16),12 ),
  new StockQuantity("正常品",new DateTime(2017,4,17),15 ),
  new StockQuantity("殘次品",new DateTime(2017,4,16),10 ),
  new StockQuantity("殘次品",new DateTime(2017,4,17),8 ),
  new StockQuantity(null,new DateTime(2017,4,18),8 ),
  };
 
  stockQuantities = stockQuantities.OrderBy(u => u.Status==null).ThenBy(u => u.DateTime).ThenBy(u => u.Quantity).ToList();
 
  foreach (var stockQuantity in stockQuantities)
  {
  Console.WriteLine($"{stockQuantity.Status}-{stockQuantity.DateTime}-{stockQuantity.Quantity}");
  }
  Console.ReadKey();
 }
 }
 
 public class StockQuantity
 {
 public StockQuantity(string status, DateTime dateTime, int quantity)
 {
  Status = status;
  DateTime = dateTime;
  Quantity = quantity;
 }
 public string Status { get; set; }
 public DateTime DateTime { get; set; }
 public int Quantity { get; set; }
 }
}

簡單的一個排序優化,就把程序的時間復雜度從N*N降低到了N,所以在這里把這兩種排序技巧分享出來,希望對不會的同學有所幫助。

總結

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美综合在线一区 | 国产精品a久久久久 | 99re6在线视频精品免费 | 君岛美绪一区二区三区在线视频 | 国产精品视频在线观看 | 国产精品久久久久久久久久东京 | 亚洲精品字幕 | 久在线视频 | 亚洲电影在线播放 | 欧美日韩精品久久久免费观看 | 精品无码久久久久久国产 | 国产婷婷色一区二区三区 | 国产成人在线视频 | 色九九| 51ⅴ精品国产91久久久久久 | 奇米二区 | 国产精品视频入口 | 亚洲不卡 | 欧美视频一区 | 亚洲精品999| 日韩电影一区二区三区 | 黄色在线免费 | 99热在线精品免费 | 国产人妖一区二区 | 欧美精品一区二区三区在线四季 | 国产亚洲精品美女久久久久久久久久 | 91麻豆精品国产91久久久更新资源速度超快 | 午夜电影网站 | 久久久久久久免费观看 | 午夜视频免费在线观看 | 亚洲视频在线一区 | 成人午夜视频免费 | 91视频com| 亚洲一区中文字幕 | 国产成人精品久久二区二区91 | 亚洲成人综合网站 | 欧美日韩一区二区三区不卡视频 | 亚洲精品大片 | 国产精品成av人在线视午夜片 | 国产成人一级毛片 | 国产精品久久久久久久久久久久久 |