简体   繁体   中英

Select specific records in a c# list with a max value

I want to select elegantly foreach unique couple (departuretime, arrivaltime, travelclass) , the best records with lower price as bold here in the table.

This is below the code which brings me lines of result.

tripRepository.FindBy(x => x.SearchID == id).Include(b => b.Results)


- DepartureTime          ArrivalTime            TravelClass  Price 
====================================================================================

- 01/08/2013 09:13:00    01/08/2013 10:14:00     economy    4700
- 01/08/2013 09:13:00    01/08/2013 10:14:00     first      8300
- 01/08/2013 09:13:00    01/08/2013 10:14:00     economy    2750
- **01/08/2013 09:13:00  01/08/2013 10:14:00     first      3600**
- **01/08/2013 09:13:00  01/08/2013 10:14:00     economy    2000**
- 01/08/2013 10:11:00    01/08/2013 11:14:00     economy    4700
- 01/08/2013 10:11:00    01/08/2013 11:14:00     first      8300
- 01/08/2013 10:11:00    01/08/2013 11:14:00     economy    2750
- 01/08/2013 10:11:00    01/08/2013 11:14:00     first      2950
- **01/08/2013 10:11:00  01/08/2013 11:14:00     economy    2000**
- **01/08/2013 10:11:00  01/08/2013 11:14:00     first      2800**

Thanks you very much

.GroupBy(m => new {
   m.DepartureTime,
   m.ArrivalTime,
   m.TravelClass
})
.Select(g  => g.OrderBy(x => x.Price).First());

You should be able to do something like the following:

var result = yourRepo.OrderBy(p => p.Price)
                     .ThenBy(n => n.Name)
                     .Take(stuff.Select(q => q.Name)
                                .Distinct()
                                .Count());

In the same way that I posted here : https://stackoverflow.com/a/16567385/2385557

try this :

public class Test
{
    public void Exec()
    {
        var items = new List<Item>{ 
        new Item { DepartureTime = "01/08/2013 09:13:00", ArrivalTime = "01/08/2013 10:14:00", TravelClass="economy" , Price =        4700 },
        new Item { DepartureTime = "01/08/2013 09:13:00", ArrivalTime = "01/08/2013 10:14:00", TravelClass="first"   , Price =        8300 },
        new Item { DepartureTime = "01/08/2013 09:13:00", ArrivalTime = "01/08/2013 10:14:00", TravelClass="economy" , Price =        2750 },
        new Item { DepartureTime = "01/08/2013 09:13:00", ArrivalTime = "01/08/2013 10:14:00", TravelClass="first"   , Price =        3600 },
        new Item { DepartureTime = "01/08/2013 09:13:00", ArrivalTime = "01/08/2013 10:14:00", TravelClass="economy" , Price =        2000 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="economy" , Price =        4700 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="first"   , Price =        8300 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="economy" , Price =        2750 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="first"   , Price =        2950 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="economy" , Price =        2000 },
        new Item { DepartureTime = "01/08/2013 10:11:00", ArrivalTime = "01/08/2013 11:14:00", TravelClass="first"   , Price =        2800 },

    };

        var result = items
                        .GroupBy(groupedItems => new { groupedItems.DepartureTime, groupedItems.ArrivalTime, groupedItems.TravelClass })
                        .SelectMany(i => items
                                             .Where(innerItem =>
                                                                    (innerItem.DepartureTime == i.Key.DepartureTime
                                                                    && innerItem.ArrivalTime == i.Key.ArrivalTime
                                                                    && innerItem.TravelClass == i.Key.TravelClass)
                                                                    && innerItem.Price == i.Min(ii => ii.Price))
                                             .Select(innerItem => innerItem)
                                             );

        foreach (var item in result)
            Console.WriteLine("Cheapest flight with departure at {0}, arrival at {1} and in travel class {2} costs {3}", item.DepartureTime, item.ArrivalTime, item.TravelClass, item.Price);

    }

    private class Item
    {
        public String DepartureTime { get; set; }
        public String ArrivalTime { get; set; }
        public String TravelClass { get; set; }
        public Int32 Price { get; set; }
    }

}

the output gives :

Cheapest flight with departure at 01/08/2013 09:13:00, arrival at 01/08/2013 10:14:00 and in travel class economy costs 2000

Cheapest flight with departure at 01/08/2013 09:13:00, arrival at 01/08/2013 10:14:00 and in travel class first costs 3600

Cheapest flight with departure at 01/08/2013 10:11:00, arrival at 01/08/2013 11:14:00 and in travel class economy costs 2000

Cheapest flight with departure at 01/08/2013 10:11:00, arrival at 01/08/2013 11:14:00 and in travel class first costs 2800

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM