LINQ 按多個欄位排序

世紀緣發表於2016-07-15

LINQ 按多個欄位排序(orderby、thenby、Take)

 

orderby  子句解析為 OrderBy()方法,orderby descending 子句解析為OrderBy Descending()方法:
var racers = Formula1.GetChampions().
Where(r = > r.Country == "Brazil").
OrderByDescending(r = > r.Wins).
Select(r = > r);

OrderBy() 和 OrderByDescending  ()方法返回 IOrderEnumerable。這個介面派生於介面
IEnumerable,但包含一個額外的方法CreateOrderedEnumerable- ()。
這個方法用於進一步給序列排序。

如果根據關鍵字選擇器來排序,兩項的順序相同,就可以使用 ThenBy()和 ThenByDescending  ()方法繼續排序。

這兩個方法需要 IOrderEnumerable才能工作,但也返回這個介面。

所以,可以新增任意多個 ThenBy()和 ThenByDescending ()方法,對集合排序。

 

使用 LINQ  查詢時,只需把所有用於排序的不同關鍵字(用逗號分隔開)新增到orderby  子句中。

這裡,
所有的賽手先按照國家排序,再按照姓氏排序,最後按照名字排序。

新增到 LINQ 查詢結果中的Take()擴充套件方法用於提取前 10  個結果:

private static void Ordering() { var racers = (from in Formula1.GetChampions()orderby r.Country, r.LastName, r.FirstName select r).Take(10); foreach (var racer inracers) { Console.WriteLine("{0:C}: {0:L}, {0:F}", racer); //屬性名的第一個字母 } }

Lambda表示式 使用OrderBy()和 ThenBy()方法可以執行相同的操作:

private static void Ordering() {
var racers = Formula1.GetChampions(). OrderBy(r => r.Country). ThenBy(r => r.LastName). ThenBy(r => r.FirstName). Take(10);
foreach (var racer in racers) { Console.WriteLine("{0:C}: {0:L}, {0:F}", racer); //屬性名的第一個字母 }
}

相關文章