2010-07-28 7 views
4

J'ai une classe.Utilisez Linq et lambda pour aplatir une liste

public class MedicalRequest 
{ 
    private int id 
    private IList<MedicalDays> Days 
    private string MedicalUser 
    ... 
} 

et un autre

public class MedicalDays 
{ 
    private int id; 
    private DateTime? day 
    private MedicalRequest request 
    ... 
} 

Je le MedicalUser donc je suis en mesure de sélectionner un

IList<MedicalRequest> reqList = dao.FindAll(example); 

Ce que j'aimerais pouvoir faire à ce stade est aplatir les listes de MedicalDays et retourner le jour DateTime.

Quelque chose comme

IList<DateTime> dateList = reqList.SelectMany(i => i.MedicalDays.day); 

Quelqu'un peut-il me donner un coup de pouce dans la bonne direction?

Merci pour votre temps.

Répondre

16

Vous y êtes presque:

IEnumerable<DateTime?> dateList = reqList.SelectMany(i => i.MedicalDays) 
             .Select(m => m.day); 

Ou:

IEnumerable<DateTime?> dateList = reqList.SelectMany(i => i.MedicalDays, 
                (i, m) => m.day); 
  • Si vous avez besoin d'un IList<T> au lieu de IEnumerable<T> vous pouvez appeler ToList() sur le résultat
  • Si vous avez besoin pour travailler avec DateTime au lieu de DateTime? vous pouvez filtrer t jours nuls comme celui-ci:

    IEnumerable<DateTime?> dateList = reqList.SelectMany(i => i.MedicalDays) 
                 .Select(m => m.day) 
                 .Where(x => x.HasValue) 
                 .Select(x => x.Value); 
    
+0

Merci Jon, très utile comme toujours. – jim

5
IEnumerable<DateTime> dateList = reqList.SelectMany(i => i.MedicalDays) 
             .Select(i => i.day); 
+0

Merci pour votre réponse Ben. – jim