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

我嘗試將此雙foreach轉換爲linq。有什麼建議麼? 到目前爲止,我嘗試了這一點,但有一個編譯錯誤。將雙foreach轉換爲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).Any(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; 

...但是,這將通過所有組合重複,當你只需要找到滿足條件的第一個,所以你可以做到這一點,找到第一個後就會停止:

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