• .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的要求。

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


    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();
    即可完美地实现再前一个排序前提下进行二级排序。

    优化后的完整代码如下:

    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

    可再简化:

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

  • 相关阅读:
    【Project4】【技术总结】
    JS实现新浪微博搜索框提示的特效代码
    动态效果显示的人物结构的关系图
    人立方
    javascript 动态显示复杂结构的网络关系图
    Adding a Timepicker to jQuery UI Datepicker
    【Framework】【清单】
    JavaScript[Mount]
    10 jQuery Time Picker Plugins
    CSS样式切换技巧 动态更换网页色彩皮肤(转)
  • 原文地址:https://www.cnblogs.com/zeroone/p/8861383.html
Copyright © 2020-2023  润新知