none
Select et SelectMany en LinqEntities RRS feed

Réponses

  • Bonjour,

    La méthode Select() permet de "projeter" un élément sous une autre forme. En clair depuis un IEnumerable<T> on manipule des éléments T, mais si j'ai besoin de traiter cet élément sous une autre forme (l'encapsuler par exemple) ou d'extraire une ou plusieurs propriétés de cet élément on va utiliser Select().

    Imaginons que j'ai une liste de dates, et que je veuille obtenir toutes ces dates mais formatées en chaîne :

    IEnumerable<DateTime> dates = new DateTime[]{....};
    
    var dateStrings = dates.Select( d => d.ToString());
    // dateStrings est un IEnumerable<String>
    
    

    Si j'avais besoin de récupérer une liste d'objet MaDate basé sur ces dates

    IEnumerable<DateTime> dates = new DateTime[]{....};
    
    var mesDates = dates.Select( d => new MaDate(d) );
    // mesDates est un IEnumerable<MaDate>
    


    Pour le SelectMany() il s'agit d'a peu près la même chose, sauf que la valeur de retour doit être un IEnumerable<T2>, et que l'ensemble des résultats est aplati en une seule séquence.

    Par exemple si je liste tous les types de tous les assemblies chargés :

    var allTypes = AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetTypes());
    // allTypes est un IEnumerable<Type[]>
    
    
    var allTypes2 = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
    // allTypes2 est un IEnumerable<Type>

    Dans le cas de allTypes (via Select() ) on va se retrouver avec une séquence de Type[], alors que allTypes2 (via SelectMany() ) on a une séquence de Type.

    J'espère que c'est plus clair :)

    Cordialement,


    Yan Grenier

    mardi 28 janvier 2014 17:52
  • Bonjour,

    En gros SelectMany() permet "d'aplatir" des collections d'objets.

    Par exemple imaginons que vous avez un objet Client qui contient une collection de Facture.

    Si vous avez une séquence d'objet Client vous avez la possibilité avec SelectMany() de récupérer une séquence contenant toutes les factures de tous les clients. C'est l'équivalent de faire une double boucle foreach (l'une pour les clients et l'autre pour les facture d'un client).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Proposé comme réponse Aurel Bera jeudi 30 janvier 2014 07:35
    • Marqué comme réponse Aurel Bera mardi 4 février 2014 12:24
    mercredi 29 janvier 2014 00:21
    Modérateur

Toutes les réponses

  • Bonjour,

    La méthode Select() permet de "projeter" un élément sous une autre forme. En clair depuis un IEnumerable<T> on manipule des éléments T, mais si j'ai besoin de traiter cet élément sous une autre forme (l'encapsuler par exemple) ou d'extraire une ou plusieurs propriétés de cet élément on va utiliser Select().

    Imaginons que j'ai une liste de dates, et que je veuille obtenir toutes ces dates mais formatées en chaîne :

    IEnumerable<DateTime> dates = new DateTime[]{....};
    
    var dateStrings = dates.Select( d => d.ToString());
    // dateStrings est un IEnumerable<String>
    
    

    Si j'avais besoin de récupérer une liste d'objet MaDate basé sur ces dates

    IEnumerable<DateTime> dates = new DateTime[]{....};
    
    var mesDates = dates.Select( d => new MaDate(d) );
    // mesDates est un IEnumerable<MaDate>
    


    Pour le SelectMany() il s'agit d'a peu près la même chose, sauf que la valeur de retour doit être un IEnumerable<T2>, et que l'ensemble des résultats est aplati en une seule séquence.

    Par exemple si je liste tous les types de tous les assemblies chargés :

    var allTypes = AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetTypes());
    // allTypes est un IEnumerable<Type[]>
    
    
    var allTypes2 = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
    // allTypes2 est un IEnumerable<Type>

    Dans le cas de allTypes (via Select() ) on va se retrouver avec une séquence de Type[], alors que allTypes2 (via SelectMany() ) on a une séquence de Type.

    J'espère que c'est plus clair :)

    Cordialement,


    Yan Grenier

    mardi 28 janvier 2014 17:52
  • Bonjour,

    En gros SelectMany() permet "d'aplatir" des collections d'objets.

    Par exemple imaginons que vous avez un objet Client qui contient une collection de Facture.

    Si vous avez une séquence d'objet Client vous avez la possibilité avec SelectMany() de récupérer une séquence contenant toutes les factures de tous les clients. C'est l'équivalent de faire une double boucle foreach (l'une pour les clients et l'autre pour les facture d'un client).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Proposé comme réponse Aurel Bera jeudi 30 janvier 2014 07:35
    • Marqué comme réponse Aurel Bera mardi 4 février 2014 12:24
    mercredi 29 janvier 2014 00:21
    Modérateur
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 3 février 2014 10:24
  • Bonjour,

    Pouvons-nous considérer que vous avez résolu votre problème avec les scénarios proposés ? Dans l'affirmative, pourriez-vous partager avec nous la solution, afin que d'autres personnes avec le même problème puissent profiter de cette solution ?

    Désormais, nous marquons les solutions proposées. N'hésitez pas à revenir et supprimer la réponse marquée si la solution n’est pas correcte. Merci !

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 4 février 2014 12:25