2011-09-09 7 views
0

Vu le code suivant:Tri ICollection décroissant par moyenne, y compris les valeurs nullables

class Book { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ICollection<Review> Reviews { get; set; } 
} 

class Review { 
    public int ID { get; set; } 
    public int? Overall { get; set; } 
    public string Comment { get; set; } 
} 

Et en supposant que j'ai une liste de tous les livres de la base de données:

var books; // List<Book> 

Je voudrais montrer la utiliser les livres classés par la revue moyenne. Idéalement, la liste des livres aurait l'examen moyen le plus élevé en haut et le tri décroissant. Étant donné que j'ai la note globale dans Review sous la forme d'un entier nul, certains livres n'auront pas d'avis, et encore moins un score global. Je vais avoir du mal trier ces données, j'ai essayé apparemment toutes les combinaisons de:

books.OrderByDescending(b => b.Reviews.Average(a => a.Overall)); 

Est-il possible de trier ma liste sans créer une seconde liste pour obtenir quelque chose comme:

  • Livre A (4,5/5)
  • livre B (4,3/5)
  • Book C (3,9/5)
  • livre D (3,5/5)
  • livre E (-/5)
  • Livre F (-/5)

Merci d'avance.

Répondre

0

Merci de me TheCodeKing pour le point dans la bonne direction. Voici ce qui a résolu le problème:

books.OrderByDescending(b => b.Reviews.Count() == 0 ? 0 : b.Reviews.Average(r => r.Overall ?? 0)); 
1

Vous devriez pouvoir utiliser ceci:

books.OrderByDescending(b => 
        (b.Reviews == null) ? 0:b.Reviews.Average(r => r.Overall??0)); 
+0

Malheureusement, cela n'a pas fonctionné, il déclenche une exception d'opération invalide "séquence ne contient aucun élément". Merci quand même. – Jon

+0

@jon - Je pense que vous devez vérifier et de plus près au message d'erreur. Est-ce que les livres ont des critiques? – Ahmad

+0

@Ahmad, la question initiale était comment puis-je trier une liste de livres par revue moyenne compte tenu du fait que certains livres n'ont pas de commentaires? – Jon

Questions connexes