2016-09-23 2 views
-5
foreach (var lg in basket) 
{ 
    foreach (var acc in lg.Accomodations) 
    { 
     if (acc.HotelID == h.ID) 
     { 
      hotel.SelectedInPreviousLeg = true; 
     } 
    } 
} 

Я пытаюсь преобразовать этот двойной foreach в linq. Какие-либо предложения? До сих пор я пробовал это, но есть ошибка компиляции.Convert double foreach to LinQ

var test = basket.FirstOrDefault(x => x.Accommodations, Any(y => y.HotelID == h.ID)); 
hotel.SelectedInPreviousLeg = (test != null) ? true : false; 
+2

'hotel.SelectedInPreviousLeg = basket.SelectMany (lg => lg.Accomodations). Любой (acc => acc.HotelID == h.ID);' –

+0

Отлично работает, спасибо mr.Vogt. – G3oRge

ответ

1

или, предполагающие классы определены равносильно

public class Hotel 
{ 
    public int ID { get; set; } 
    public List<Accomodation> Accomodations { get; set; } 
    public bool SelectedInPreviousLeg { get set; } 
} 

public class Accomodation 
{ 
    public int HotelID { get; set; } 
} 

, то вы можете сделать это:

foreach (var acc in 
    from lg in basket 
    from acc in lg.Accomodations 
    where acc.HotelID == h.ID 
    select acc) 
     hotel.SelectedInPreviousLeg = true; 

... но это будет перебирать все комбинации, когда вам нужно только чтобы найти первый, который удовлетворяет condiditon, так что вы можете сделать это, что остановится после поиска первого:

hotel.SelectedInPreviousLeg = 
    basket 
     .Any(b => b.Accomodations 
     .Any(a => a.HotelID == h.ID));