2016-05-12 3 views
1

Мне нужно получить минимум стоимости рейсов за один день. aFlightList заполните все варианты полетов. В этом массиве есть число рейсов на один день. Я должен получить один рейс за один день, чтобы этот полет имел минимальную цену. Я использую linq такой, как это, но в этом разделе Min(x => x.PriceView) получить ошибку. Как это исправить?Как использовать групповое и минимальное количество строк для одного массива?

//AFlight is a class 
AFlight[] aFlightList = { new AFlight() }; 
aFlightList = charterService 
    .GetFlightList(chfs.DepCityId, true, chfs.ArrCityId, true, 
     chfs.Fromdate.ToString("yyyy/MM/dd"), 
     chfs.Fromdate.AddDays(chfs.DateRange - 1).ToString("yyyy/MM/dd"), 
     authentication); 

aFlightList = (AFlight[])aFlightList 
    .GroupBy(x => x.FlightDate) 
    .Min(x => x.PriceView); 

ответ

1

IGrouping реализует IEnumerable. Таким образом, вы можете получить каждый отдельный пункт в IGrouping, а затем получить его PriceView и искать минимум, как это:

AFlight[] aFlightList = { new AFlight() }; 
aFlightList = charterService.GetFlightList(chfs.DepCityId, true, chfs.ArrCityId, true, chfs.Fromdate.ToString("yyyy/MM/dd"), chfs.Fromdate.AddDays(chfs.DateRange - 1).ToString("yyyy/MM/dd"), authentication); 
aFlightList = aFlightList 
    .GroupBy(x => x.FlightDate); 
    .Select(g => g.OrderBy(x => x.PriceView).First()) 
    .ToArray(); 

Ключ, чтобы получить группы IEnumerable и упорядочивание по PriceView, чтобы получить (минимум) First

+0

Большое спасибо ... – programmer138200

+0

Добро пожаловать. :) – Ian

2

Вы можете использовать перегрузку GroupBy, которая принимает resultselector, чтобы сделать все это сразу, а не только прохождение 1 лямбда, чтобы выбрать ключ, пройти второй, чтобы выбрать набор результатов:

var res = aFlightList 
    .GroupBy(item => 
       // State that you want to group by date 
       item.FlightDate, 
       // Will be called for each pair, you don't use the key as it's already part of the original object you will return, here for each group you'll only return a single item, the lowest priced one and will end up with an IEnumerable containing the cheapest one of each group 
       (key, pairs) => pairs 
        .OrderBy(p => p.PriceView) 
        .First()); 

Эта перегрузка groupby возвращает плоский IEnumerable, поэтому вы даже не вступаете в IGroupings с одним элементом в коллекции, но с плоскими объектами.

Смежные вопросы