深入理解 c# 用OrderBy方法进行排序 根据两个属性对序列进行排序

 

https://blog.csdn.net/eyetired/article/details/80035623

 

   class RangeOrdering
    {
        static void Main()//用OrderBy方法进行排序 根据两个属性对序列进行排序
        {
            var collection = Enumerable.Range(-5, 11) //先构造-5到5的整数集合
                                       .Select(x => new { Original = x, Square = x * x })
                                       // x = -5 -4 -3 -2 -1 0 1 2 3 4 5
                                       //投影到一个包含原始数字及其平方的匿名类型
                                       //后面,先按平方进行排序,再按原始数字进行排序
                                       //用了匿名类型的ToString实现格式化
                                       .OrderBy(x => x.Square)
                                       //执行x => x.Square
                                       //{ Original = -5, Square = 25 }
                                       //{ Original = -4, Square = 16 }
                                       //{ Original = -3, Square = 9 }
                                       //{ Original = -2, Square = 4 }
                                       //{ Original = -1, Square = 1 }
                                       //{ Original = 0, Square = 0 }
                                       //{ Original = 1, Square = 1 }
                                       //{ Original = 2, Square = 4 }
                                       //{ Original = 3, Square = 9 }
                                       //{ Original = 4, Square = 16 }
                                       //{ Original = 5, Square = 25 }
                                       
                                       
 
                                       .ThenBy(x => x.Original);
                                       //执行 x => x.Original
                                       //{ Original = -5, Square = 25 }
                                       //{ Original = -4, Square = 16 }
                                       //{ Original = -3, Square = 9 }
                                       //{ Original = -2, Square = 4 }
                                       //{ Original = -1, Square = 1 }
                                       //{ Original = 0, Square = 0 }
                                       //{ Original = 1, Square = 1 }
                                       //{ Original = 2, Square = 4 }
                                       //{ Original = 3, Square = 9 }
                                       //{ Original = 4, Square = 16 }
                                       //{ Original = 5, Square = 25 }
                                       
//System.Linq.OrderedEnumerable<<>f__AnonymousType1<int,int>,int>
            foreach (var element in collection)
//先是foreach 后 collection 后 in in调用.Select 后.OrderBy 后 .ThenBy 后 var element
//var element的值为  后in 后var elements
//{ Original = 0, Square = 0 }
//{ Original = -1, Square = 1 }
//{ Original = 1, Square = 1 }
//{ Original = -2, Square = 4 }
//{ Original = 2, Square = 4 }
//{ Original = -3, Square = 9 }
//{ Original = 3, Square = 9 }
//{ Original = -4, Square = 16 }
//{ Original = 4, Square = 16 }
//{ Original = -5, Square = 25 }
//{ Original = 5, Square = 25 }
            {
                Console.WriteLine(element);
            }
        }
    }

 

对数据排序是处理数据时一项常规要求。在LINQ中,这一般是通过OrderBy或
OrderByDescending方法来实现的。如果需要根据数据的多个属性排序,
那么后面还可以跟随ThenBy或ThenByDescending方法来实现。
  如果需要根据数据的多个属性排序,那么后面还可以跟随ThenBy或ThenByDescending。
基于多项属性排序这种复杂的操作往往会用到复杂的比较,但如果能以一系列简单
的比较来定义这种顺序,那么通常能化繁为简。
  “主”排序属性是Square,对于平方值相同的两个值,负的原始值总是排在正的
原始值前面。而如果用单一的比较来实现相同的目标则要复杂得多,复杂到你
不想在Lambda表达式中"内联"代码的程度
   排序不会改变原始集合--返回的是新的序列,所产生的数据与输入序列相同,
当然除了顺序。排序与List<T>.Sort和Array.Sort不同,会改变列表或数组中
元素的顺序。LINQ操作符无副作用:LINQ操作符不会影响输入,不会改变环境。
除非迭代的是一个自然状态序列(如从网络流中读取数据)或使用含有副作用的委托
参数。这是函数式编程的方法,可以使代码更加可读、可测、可组合、可预测、

健壮并且线程安全。

输出
{ Original = 0, Square = 0 }
{ Original = -1, Square = 1 }
{ Original = 1, Square = 1 }
{ Original = -2, Square = 4 }
{ Original = 2, Square = 4 }
{ Original = -3, Square = 9 }
{ Original = 3, Square = 9 }
{ Original = -4, Square = 16 }
{ Original = 4, Square = 16 }
{ Original = -5, Square = 25 }
{ Original = 5, Square = 25 }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值