9
votes

Comment grouper en utilisant LINQ, puis obtenir la valeur du plus grand groupe

Voici ce que j'ai jusqu'à présent:

ID,Reason
---------
0,Weather
1,Traffic
2,Illness
3,Weather
4,Traffic
5,Traffic
6,Pirates


0 commentaires

3 Réponses :


16
votes
var bestReason = successfulReasons
    .GroupBy(r => r.Reason)
    .OrderByDescending(grp => grp.Count())
    .First().Key;

3 commentaires

devrait être .first (). clé à la fin imo


Merci. J'ai continué à essayer de mettre en oeuvre en quelque sorte max (). OrderbyDescendant () et premier () travail génial. Alors, comment puis-je marquer une réponse lorsque deux personnes ont dit fondamentalement la même chose? Je pense que j'aime bien la linqiness (est-ce un mot?) De plus (c'est-à-dire comment chaque commande fonctionne avec les résultats de la précédente).


@Slightly A - Je crois qu'il y a un temps minimum avant de pouvoir accepter une réponse.



3
votes

Si je comprends votre question correctement, vous pouvez faire:

string bestReason =
    (from p in successfulReasons
     orderby p.Reason
     group p by p.Reason into g
     orderby g.Count() descending
     select g.Key).FirstOrDefault();


4 commentaires

Lorsque vous appelez Count () sur votre IQuéryable >, ne convertissez-vous pas votre iQUERYABLE EN UN IEnumerable plusieurs fois? Une fois par igrrouping <>? En fin de compte, je suis intrigué pour voir quel type d'appelle SQL appelle ce type de code génère.


@weirdlover, c'est une très bonne question. La plupart du temps, j'utilise Linq vers des objets ou sur XML, je n'ai donc jamais eu la chance d'essayer avec le fournisseur SQL.


D'ACCORD. Répondu à ma propre question. On dirait que Linq est assez intelligent pour générer un bref ... Sélectionnez le top 1 ... Appel. Assez cool, en fait.


Ajouté le SQL généré à ma réponse - et je vous donne le uppot de répondre correctement à la question. Merci de me forcer à regarder sous le capot! Acclamations, e



1
votes
string excuse = this.repo.Excuses.MostCommonFor(ProblemList.BeingLate);

0 commentaires