Linq - Dessus de la valeur de chaque groupe
Comment puis-je employer Linq pour sélectionner la valeur Supérieure de chaque groupe
quand j'ai un segment de code comme :
var teams = new Team[]
{
new Team{PlayerName="Ricky",TeamName="Australia", PlayerScore=234},
new Team{PlayerName="Hussy",TeamName="Australia", PlayerScore=134},
new Team{PlayerName="Clark",TeamName="Australia", PlayerScore=334},
new Team{PlayerName="Sankakara",TeamName="SriLanka", PlayerScore=34},
new Team{PlayerName="Udana",TeamName="SriLanka", PlayerScore=56},
new Team{PlayerName="Jayasurya",TeamName="SriLanka", PlayerScore=433},
new Team{PlayerName="Flintop",TeamName="England", PlayerScore=111},
new Team{PlayerName="Hamirson",TeamName="England", PlayerScore=13},
new Team{PlayerName="Colingwood",TeamName="England", PlayerScore=421}
};
Résultat Souhaité :
Nom De L'Équipe Nom Du Joueur Score Srilanka Jayasurya 433 L'angleterre colingwood 421 L'Australie Clark 334
Vous devez vous connecter pour publier un commentaire.
Ma réponse est similaire à Yuriy, mais à l'aide de
MaxBy
de MoreLINQ, qui ne nécessitent pas la comparaison doit être faite par ints:Noter que j'ai changé le nom du type de "l'Équipe" pour "de Joueur" car je crois qu'il est plus judicieux - vous ne pas commencer avec une collection d'équipes, vous commencez avec une collection de joueurs.
Le code suivant renvoie la valeur souhaitée:
Il nécessite l'extension suivante que j'ai écrit plus tôt aujourd'hui:
Suivantes obtient la réponse sans l'extension, mais il est légèrement plus lent:
OrderBy
façon. Je déteste les extensions inutiles.Cela exigera de vous de groupe par le nom de l'équipe, puis sélectionnez la note maximale.
La seule partie difficile est d'obtenir le joueur correspondant, mais ce n'est pas trop mauvais. Il suffit de sélectionner le joueur avec le score max. De gros, si son possible pour plus d'un joueur d'avoir des scores identiques de faire cela en utilisant la fonction Premier() comme indiqué ci-dessous, plutôt que la Seule fonction ().
Pour info, j'ai fait exécuter ce code à l'encontre de vos données et cela a fonctionné (après j'ai corrigé ça, peu de données erreur).
Je voudrais utiliser cette expression Lambda:
La mise en œuvre proposé par Le Canard Boiteux est très bien, mais nécessite deux O(n) passe au-dessus de la groupés ensemble pour trouver le Max. Il serait avantageux de calculer MaxScore une fois, puis de les réutiliser. C'est là que SelectMany (le mot-clé let en C#) est très pratique. Ici est l'optimisation de la requête:
Je vous suggère d'abord de mettre en œuvre une méthode d'extension sur le IEnumerbale classe appelée Top
Par exemple:
Ensuite, vous pouvez écrire:
équipes.GroupBy(équipe => l'équipe.TeamName).En haut(de l'équipe => l'équipe.PlayerScore, 1).
Il pourrait y avoir quelques légères modifications à faire de la compilation.