.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

相关文章
相关标签/搜索