2016-09-23 63 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));