2011-04-24 19 views
10

espero que me puedan ayudar aquí. Tengo una lista de reservas donde me gustaría obtener las 2 filas superiores en cada grupo de TourOperators.Cómo seleccionar las N primeras filas en un Grupo LinqPor

He aquí una muestra de los datos:

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" }); 

tengo este LINQ, pero sólo me da la primera reserva en cada grupo:

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

Los datos que yo esperaba era algo de esta manera:

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

Gracias.

Respuesta

17

Reemplazar con First()Take(2) y utilizar SelectMany():

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

actualización: olvidó la SelectMany primera vez. Desea aplanar el resultado (que SelectMany), de lo contrario obtendrá una lista de IEnumerables.

+0

que me da: No se puede convertir implícitamente el tipo 'System.Collections.Generic.List > 'a' System.Collections.Generic.List ' –

+0

JensRud, intente utilizar var y ver en depurar qué tipo tiene yetAnotherList. –

+0

¡Guau, gracias Chris, la combinación de SelectMany y Take fue justo lo que necesitaba! Los resultados necesitaban aplanamiento como usted señaló. –

1

Intente utilizar var y reemplazar con First()Take(2):

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

JensRud dijo, que tiene una excepción después de reemplazar First() con Take (2). ¿¡Qué quieres decir!? Le aconsejé a JensRud que use var para tener la capacidad de ver información más detallada sobre el resultado. Estoy seguro de que no será una excepción. –

+0

Gracias por su respuesta Joolio, solo me da dos listas anidadas, y necesito que se aplana el resultado. SelectMany hace esto como he descubierto por la respuesta de Chris. –

Cuestiones relacionadas