private Recensione _recensione; //riferimento #endregion Fields #region Constructors public Videogioco(string nome, DateTime dataRilascio, Genere genere) { //l'enumerativo garantisce già che non si utilizzino valori non ammessi //DateTime è una struct, non può avere come valore null if (String.IsNullOrEmpty(nome)) throw new ArgumentNullException("String.IsNullOrEmpty(nome)"); this._nome = nome; this._dataRilascio = dataRilascio; this._genere = genere; this._recensione = null; // TODO //this._image = Image.FromFile("default_image_videogioco"); }
//semplicemente la media public float Calcola(Recensione recensione) { #region Precondizioni if (recensione == null || recensione.GetAspettiValutati()==null) throw new ArgumentNullException("recensione==null||recensione.GetAspettiValutati()==null"); #endregion //recupero solo le valutazioni IEnumerable<int> valutazioni = from aspettoValutato in recensione.GetAspettiValutati() select aspettoValutato.Valore; //ritorno NaN se non ci sono valutazioni (O ECCEZIONE!?!?) if (valutazioni.Count() == 0) return float.NaN; //c'è già una funzione apposta per la media return (float) valutazioni.Average(); }
//poichè questo metodo necessita anche dell'utente (o del delegato, vedi sopra), esso è fornito nel costruttore public float Calcola(Recensione recensione) { #region Precondizioni if (recensione == null || recensione.GetAspettiValutati() == null) throw new ArgumentNullException("recensione==null||recensione.GetAspettiValutati()==null"); #endregion //somma parziale per la media ponderata int sum=0; //denominatore della media ponderata int sumPreferenze=0; //conteggio dei match int count=0; foreach(AspettoValore aspettoValutato in recensione.GetAspettiValutati()) { foreach(AspettoValore preferenza in _utente.GetPreferenze()) { // == per le stringhe è uguaglianza dei valori if(aspettoValutato.Aspetto.Nome==preferenza.Aspetto.Nome) { //aggiorno le sommatorie sum += aspettoValutato.Valore * preferenza.Valore; sumPreferenze += preferenza.Valore; count+=1; //interrompo il for interno per efficienza break; } } } //ritorno NaN se non c'è stato neanche un match oppure se al denominatore ho 0 (O ECCEZIONE!?!?) if (count == 0 || sumPreferenze==0) return float.NaN; //i cast forzano la divisione tra reali e non tra interi return (float) sum / (float) sumPreferenze; }