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

Linq Discussion :

comment remplacer un foreach par du LINQ ?


Sujet :

Linq

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 135
    Points
    135
    Par défaut comment remplacer un foreach par du LINQ ?
    Bonjour,
    J'ai actuellement ceci qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void func(Division[] divisions)
    {
        var currencies = new HashSet<string>(divisions.SelectMany(div => div.Locations).Select(e => e.CcyLoc));
        //currencies.UnionWith(new HashSet<string>(divisions.SelectMany(div => div.CurrencyCode)));
        //ou bien même
        //currencies.UnionWith(divisions.SelectMany(div => div.CcyDiv));
        foreach(CalcDivision div in divisions) {
            currencies.Add(div.CurrencyCode);
        }
    }
    Mais je ne comprends pas pourquoi je ne peux pas remplacer mon foreach par un des lignes commentée du dessus. Ça ne compile pas (invalid arguments).
    Voyez-vous le problème?
    D'avance merci,
    Julien

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    Autre approche : ToList<T>.ForEach()
    ou une méthode d'extension pour IEnumerable :

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 135
    Points
    135
    Par défaut
    Merci pour ces autres solutions.
    Ça ne répond par contre pas à ma question sur le pourquoi UnionWith ne fonctionne pas tel que je l'ai écrit. Une idée?

  4. #4
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Ça ne compile pas (invalid arguments)
    Les messages d’erreurs de Visual studio permettent de comprendre quels arguments sont invalides (pb de type ? IEnumerable<char> != IEnumerable<string> ?)

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 135
    Points
    135
    Par défaut
    Il y a 2 erreurs de compilation :
    Error 1 The best overloaded method match for 'System.Collections.Generic.HashSet<string>.HashSet(System.Collections.Generic.IEqualityComparer<string>)' has some invalid arguments
    Error 2 Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<char>' to 'System.Collections.Generic.IEqualityComparer<string>'

    Déjà j'ai utilisé des noms différents dans mon exemple désolé, mais en fait CcyLoc, CurrencyCode et CcyDiv sont les mêmes string, je n'arrive aps à modifier mon post. Où est-ce qu'il croit qu'il doit attendre un char?

  6. #6
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Dans ton exemple, "SelectMany" doit être utilisé pour une propriété de type IEnumerable<string> et "Select" pour une propriété de type string

    SelectMany sur un type string renvoie un IEnumerable<char>

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 135
    Points
    135
    Par défaut
    Effectivement Select fonctionne quand SelectMany ne fonctionne pas, c'est un peu tricky cette "mise à plat" que fait SelectMany pour passer d'un type string à un IEnumerable de char.. Dans ma 1ère ligne "SelectMany(div => div.Locations)", comment est-ce qu'il sait qu'il ne doit s'arrêter à retourner des Locations et pas d'autres types qui composent mes Locations?
    Y a-t-il une différence à faire currencies.UnionWith(new HashSet<string>(divisions.Select(div => div.CurrencyCode))); ou currencies.UnionWith(divisions.Select(div => div.CurrencyCode)); ?

  8. #8
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Dans ma 1ère ligne "SelectMany(div => div.Locations)", comment est-ce qu'il sait qu'il ne doit s'arrêter à retourner des Locations et pas d'autres types qui composent mes Locations?
    SelectMany est utilisable sur les collection de type IEnumerable<T>. "SelectMany(div => div.Locations)" renvoie un IEnumerable de Location car la propriété "Locations" est de type IEnumerable<Location>.

    Y a-t-il une différence à faire currencies.UnionWith(new HashSet<string>(divisions.Select(div => div.CurrencyCode))); ou currencies.UnionWith(divisions.Select(div => div.CurrencyCode)); ?
    Oui, mais pour ton code, d'un point de vue fonctionnel, aucune.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Message en double : ici

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

Discussions similaires

  1. comment remplacer un foreach par du LINQ ?
    Par jmclej dans le forum C#
    Réponses: 6
    Dernier message: 01/12/2014, 14h18
  2. [VB.NET] Comment remplacer une couleur par une autre?
    Par jazz matazz dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/02/2006, 15h29
  3. Comment remplacer le clavier par des boutons ?
    Par aliwassem dans le forum Langage
    Réponses: 1
    Dernier message: 14/12/2005, 20h00
  4. Réponses: 5
    Dernier message: 30/05/2005, 17h58

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