IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Utilisation d'expression lamda avec IEnumerable


Sujet :

Dotnet

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Points : 38
    Points
    38
    Par défaut Utilisation d'expression lamda avec IEnumerable
    Bonjour,

    Quelles est l'explication des résultats différents pour les 2 bouts de code suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                string[] colors = {"green","brown","blue","red" };
     
                var list = new List<string>(colors);
                IEnumerable<string> query = list.Where(c => c.Length == 3);
                list.Remove("red");
                int i = query.Count(); // i = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                string[] colors = {"green","brown","blue","red" };
     
                var list = new List<string>(colors);
                IEnumerable<string> query = list.Where(c => c.Length == 3).ToList();
                list.Remove("red");
                int i = query.Count(); // i = 1
    Dans le 1er cas est ce que l'objet query pointe sur l'objet list c'est la raison pour la quelle la suppression d'un élément influe sur le résultat, ou est ce que l'execution de la requête de recherche n'a eu lieu qu'au moment du count?

    Merci d'avance,

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    Bonjour,

    En lambda, temps que tu obtiens une Query en retour tu ne fait que construire ta requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    query = list.Where(c => c.Length == 3);
    query = query.Where(c => c.Length == 4);
    est identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = list.Where(c => c.Length == 3).Where(c => c.Length == 4);

    La query s'appui sur des éléments extérieure (ici une List<T>).
    Si ces éléments sont modifiés avant l’exécution de la query alors le résultat est impacté, sinon il n'en est rien.


    Dans ton 2eme cas le "ToList" renvoie une List<T>, la query est donc exécué, ainsi le remove n'auras aucun impact.



    Pour mieux comprendre ajoute un peux de clarté dans ton code, dans ton exemple 2:
    - limite l'utilisation des var, si tu sais ce qu'est un objet, écrit le
    - si tu fait un ToList, tu n'obtiens pas une query mais une liste alors pourquoi nommer la variable query? ça laisse supposé que la requête n'est pas exécuté
    - on utilise le var pour construire une query en plusieurs fois, l'objet est de type IQueryable<T>

    Voici 2 exemples propres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string[] colors = {"green","brown","blue","red" };
     
    List<string> list = new List<string>(colors);
     
    var query = list.Where(c => c.Length == 3 && c != "red");
     
    int i = query.Count(); // i = 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string[] colors = {"green","brown","blue","red" };
     
    List<string> list = new List<string>(colors);
     
    var query = list.Where(c => c.Length == 3);
     
    List<string> listFiltree = query.ToList();
    listFiltree.Remove("red");
     
    int i = listFiltree.Count(); // i = 0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/09/2012, 14h44
  2. Réponses: 2
    Dernier message: 04/10/2010, 21h00
  3. Réponses: 4
    Dernier message: 31/07/2007, 15h43
  4. [SimpleXML] Est-il possible d'utiliser des expressions XPATH 2.0 avec simplexml ?
    Par ANISSS dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/11/2006, 09h14
  5. utiliser une expression régulliere avec la methode getelementbyid
    Par rootdaoud dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/05/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo