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 }