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 }