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 :

[C#] Problème avec Max


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Par défaut [C#] Problème avec Max
    Bonjour,

    J'ai actuellement une liste d'objet (lstObj) comme suit :
    Nom | Total | ...
    nom1 | 12 | ...
    nom2 | 11 | ...
    nom3 | 22 | ...
    nom4 | 10 | ...
    nom5 | 22 | ...

    Je souhaiterais obtenir soit soit le ou les objets soit le ou les Noms dont le Total est le plus élevé.
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (from o in lstObj select o).Max(o=>o.Total)
    Cela ne me renvoie que le Total !
    Pouvez vous m'aider ?

    Merci.
    Mosco

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstObj.Where(o=>o.Total == lstObj.Max(i=>i.Total))

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstObj.Where(o=>o.Total == lstObj.Max(i=>i.Total))
    Ouais mais ça énumère la collection 2 fois... pas top

    Dans Dvp.NET il y a une méthode d'extension MaxBy, qui renvoie l'élément qui a la plus grande valeur pour la propriété spécifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lstObj.MaxBy(o => o.Total)
    Par contre ça ne renvoie qu'un seul élément... si tu les veux tous, tu peux modifier un peu la méthode MaxBy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
            public static IEnumerable<TSource> AllMaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
            {
                return source.AllMaxBy(selector, null);
            }
     
            public static IEnumerable<TSource> AllMaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IComparer<TKey> comparer)
            {
                comparer = comparer ?? Comparer<TKey>.Default;
                TKey maxValue = default(TKey);
                List<TSource> max = new List<TSource>();
                bool first = true;
                foreach (var item in source)
                {
                    TKey value = selector(item);
                    int compare = comparer.Compare(value, maxValue);
     
                    if (compare > 0 || first)
                    {
                        maxValue = value;
                        max.Clear();
                        max.Add(item);
                    }
                    else if (compare == 0)
                    {
                        max.Add(item);
                    }
                    first = false;
                }
                return max.ToArray();
            }
    (j'ai testé ça un peu vite, donc c'est possible qu'il y ait des cas foireux...)


    EDIT: d'ailleurs ce serait intéressant d'avoir ça dans Dvp.NET... je vais l'ajouter de ce pas

  4. #4
    Membre chevronné
    Profil pro
    Développeur freelance
    Inscrit en
    Août 2006
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur freelance

    Informations forums :
    Inscription : Août 2006
    Messages : 453
    Par défaut
    Parfait, ça marche nickel.

    Merci.

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

Discussions similaires

  1. Problème avec "MAX"
    Par guivrator dans le forum Requêtes
    Réponses: 5
    Dernier message: 16/04/2009, 14h25
  2. Problème avec "MAX" et/ou "TOP"
    Par funkyjul dans le forum Développement
    Réponses: 6
    Dernier message: 18/03/2009, 07h54
  3. problème avec MAX(Date)
    Par ouchemhou dans le forum Langage SQL
    Réponses: 12
    Dernier message: 23/08/2008, 17h13
  4. Problème avec MAX()
    Par Arkay dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/10/2007, 20h01
  5. Problème avec Max.
    Par Tyler Durden dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/10/2006, 08h05

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