2011-04-24 23 views
10

希望你能幫助我。 我有一個預訂列表,我想在每組TourOperators中獲得前兩排。如何選擇Linq Group中的前N行

這裏的數據樣本:

List<Booking> list = new List<Booking>(); 
     list.Add(new Booking() { BookingNo = "31111111", DepDate = new DateTime(2011, 5, 1), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "32222222", DepDate = new DateTime(2011, 5, 2), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "33333333", DepDate = new DateTime(2011, 5, 3), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "34444444", DepDate = new DateTime(2011, 5, 4), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "35555555", DepDate = new DateTime(2011, 5, 5), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "36666666", DepDate = new DateTime(2011, 5, 6), TourOperator = "SPI" }); 
     list.Add(new Booking() { BookingNo = "11111111", DepDate = new DateTime(2011, 5, 1), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "12222222", DepDate = new DateTime(2011, 5, 2), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "13333333", DepDate = new DateTime(2011, 5, 3), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "14444444", DepDate = new DateTime(2011, 5, 4), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "15555555", DepDate = new DateTime(2011, 5, 5), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "16666666", DepDate = new DateTime(2011, 5, 6), TourOperator = "VIN" }); 
     list.Add(new Booking() { BookingNo = "17777777", DepDate = new DateTime(2011, 5, 7), TourOperator = "VIN" }); 

我有這個LINQ的,但它只是給了我各組中的第一預訂:

List<Booking> yetAnotherList = list.GroupBy(row => row.TourOperator) 
      .Select(g => g.OrderBy(row => row.DepDate).First()).ToList(); 

我所期待的數據是什麼像這樣:

31111111,2011-05-01,SPI
32222222,2011-05-02,SPI
11111111,2011-05-01,VIN
12222222,2011-05-02,VIN

謝謝。

回答

17

更換First()Take(2),並使用SelectMany()

List<Booking> yetAnotherList = 
       list.GroupBy(row => row.TourOperator) 
        .SelectMany(g => g.OrderBy(row => row.DepDate).Take(2)) 
        .ToList(); 

更新:忘記第一次SelectMany。你想平坦的結果(其中SelectMany確實),否則你會得到一個IEnumerables的列表。

+0

這給了我:不能隱式轉換類型「System.Collections.Generic.List > '到'System.Collections.Generic.List ' – 2011-04-24 10:18:15

+0

JensRud,嘗試使用var並在調試中看到什麼類型hasAnotherList。 – 2011-04-24 10:38:19

+0

哇,謝謝Chris,SelectMany和Take的組合就是我所需要的!正如你指出的那樣,結果需要展開。 – 2011-04-24 11:07:24

1

嘗試使用var和替換First()Take(2)

var yetAnotherList = list.GroupBy(row => row.TourOperator) 
        .Select(g => g.OrderBy(row => row.DepDate).Take(2)).ToList(); 
+1

JensRud告訴他,用Take(2)替換First()後他有一個例外。你什麼意思!?我建議JensRud使用var來查看有關結果的更多詳細信息。我確定它不會是例外。 – 2011-04-24 10:35:30

+0

感謝您的回覆Joolio,只有它給了我兩個嵌套列表,並且我需要將結果展平。 SelectMany是這樣做的,正如我從克里斯的回答中發現的那樣。 – 2011-04-24 11:09:42