.Net中集合排序

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升序排序。算法

分別是條件排序、多級排序。優化

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

1.    StockQuantities.OrderBy(u=>u.Status==null)
這就是條件排序,但是咋一看,給人一種是把Status爲空的排前面,不爲空的排後面的錯覺。
其實否則,咱們看到OrderBy裏面的一個返回值爲bool類型的表達式,該排序先排結果爲0(false)的,再排結果爲1(true)的。這種排序只考慮返回的bool值,不考慮參數的具體值,因此姑且稱它爲條件排序。
徹底符合排序規則1的要求。
spa

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


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();
便可完美地實現再前一個排序前提下進行二級排序。對象

優化後的完整代碼以下:blog

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排序

可再簡化:get

stockQuantities = stockQuantities.OrderBy(u => u.Status==null).ThenBy(u=>new{u.DateTime,u.Quantity}).ToList();string

相關文章
相關標籤/搜索