2017-05-26 1 views
0

Le scénario est pour un tableau de classement de football. Je peux commander la liste par pourcentage de victoires, puis par buts marqués pour déterminer leur position dans la ligue. J'utilise ensuite cette commande pour obtenir la position des équipes dans la table de classement en utilisant la fonction IndexOf.Obtenir l'index de l'article dans la liste en fonction de la valeur

this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals); 


this.results.Foreach(x => x.Position = this.results.IndexOf(x)); 

Le problème se pose lorsque deux équipes (devrait être joint # 1) ont le même pourcentage de victoire du match et les buts marqués mais lors de l'obtention de l'indice d'une équipe seront attribués # 1 et l'autre # 2.

Y a-t-il un moyen d'obtenir la bonne position?

+0

Je suppose que votre problème n'a pas de solution, une fois que si deux éléments (ANY) a le même score dans une liste, vous serez toujours avoir un derrière l'autre. Vous devez développer un moyen d'assumer la même position de liste pour deux partitions identiques: Je vous suggère de créer un tableau bidimensionnel ou LISTE, où l'une des valeurs est la position numérique, et abandonner la position LIST comme index de chaque équipe en ligue. –

+0

Oui, c'est pourquoi j'ai posté cette question que ma méthode actuelle ne fonctionne pas. J'espérais être pointé dans la bonne direction avec d'autres solutions potentielles. –

Répondre

2
var position = 1; 
var last = result.First(); 
foreach(var team in results) 
{ 
    if (team.WinPercentage != last.WinPercentage || team.Goals != last.Goals) 
     ++position; 

    team.Position = position; 
    last = team; 
} 
+0

Je suppose que la position doit être affectée à l'équipe dans l'instruction if? –

+1

Vous avez raison. L'attribution de position doit aller * après * le 'if()'. Je l'ai réparé. –

1

Ce que vous pouvez faire est de regrouper les éléments en fonction du pourcentage de victoire et objectifs (si les deux sont les mêmes, les équipes seront dans le même groupe), puis appliquer le même numéro de position à chaque élément dans la même groupe:

this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals); 

var positionGroups = this.results.GroupBy(x => new { WinPercentage = x.WinPercentage, Goals = x.Goals }); 
int position = 1; 
foreach (var positionGroup in positionGroups) 
{ 
    foreach (var team in positionGroup) 
    { 
     team.Position = position; 
    } 
    position++; 
} 
+0

C'est la façon dont je pensais le faire (avec le groupe par) mais je me demande est James Currans réponse ci-dessous plus efficace car il n'en contient qu'une seule déclaration –

+1

@ BadDub Sa réponse est certainement plus efficace si c'est ce que vous êtes à la recherche de. Je voulais juste fournir une autre alternative. Même si 'GroupBy' n'est pas la meilleure solution pour ce problème, vous vous souviendrez probablement qu'il existe déjà dans votre répertoire. – cubrr

+1

Merci pour la réponse! –

1

le code ci-dessous le code fonctionnera pour vous

this.results = this.results.OrderByDescending(x => x.WinPercentage).ThenByDescending(x => x.Goals); 


this.results.Foreach(x => 
{ 
    int index = this.results.FindIndex(y => y.Goals == x.Goals && y.WinPercentage == x.WinPercentage); 
    x.Position = index > 0 ? this.results[index - 1].Position + 1 : 0; 
});