예제 #1
0
        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;
        }