2010-06-09 3 views
1

Imaginez que vous avez une classe comme ceci:Comment puis-je sélectionner l'élément avec la valeur la plus élevée en utilisant LINQ?

class Foo { 
    string key; 
    int value; 
} 

Comment choisiriez-vous le Foo avec la valeur la plus élevée d'un IEnumeralbe<Foo>?

Un problème de base consiste à maintenir le nombre d'itérations faible (c'est-à-dire à 1), mais cela affecte la lisibilité. Après tout, le meilleur que j'ai pu trouver était quelque chose comme ceci:

IEnumerable<Foo> list; 
Foo max = list.Aggregate ((l, r) => l.value > r.value ? l : r); 

Pouvez-vous penser à un meilleur moyen?

Modifier: list.OrderByDescending(l => l.value).First(); était mon option préférée, mais ce n'est pas O (n).

Répondre

7

Vous pouvez récupérer la méthode d'extension MaxBy LINQ à partir du projet MoreLinq de Jon Skeet. Alors c'est juste:

Foo max = list.MaxBy(f => f.value); 
+0

Maintenant, c'est attrayant. – mafu

+0

Oui, morelinq est génial. – tzaman

+0

ou, list.Where (w => w.value == liste.Max (m => valeur m)) –

2

est ici une autre option:

list.OrderByDescending(l => l.value).First(); 

ou

list.OrderBy(l => l.value).Last(); 
+0

C'est ce que j'utilisais plus tôt, mais je pense que ce n'est pas O (n). – mafu

+0

C'est vrai, ce ne serait pas le cas. –

1
Foo foo = list.Max(); 

Mais vous devez implémenter l'interface IComparable pour le type Foo;

+0

Bonne idée, mais je ne peux pas changer Foo. – mafu

Questions connexes