private int Confronta(TipoVoce voce, int i, int k)
 {
     if (!IndiceValido(i)) throw new ArgumentOutOfRangeException("i", i, null);
     if (!IndiceValido(k)) throw new ArgumentOutOfRangeException("k", k, null);
     switch (voce)
     {
         case TipoVoce.Voto:
             return (_voti[i].Valore < _voti[k].Valore) ? -1 : (_voti[i].Valore > _voti[k].Valore) ? 1 : 0;
             break;
         case TipoVoce.Tipo:
             return (_voti[i].Tipo < _voti[k].Tipo) ? -1 : (_voti[i].Tipo > _voti[k].Tipo) ? 1 : 0;
             break;
         case TipoVoce.Data:
             return (_voti[i].Data < _voti[k].Data) ? -1 : (_voti[i].Data > _voti[k].Data) ? 1 : 0;
             break;
         case TipoVoce.Materia:
             return (_voti[i].Materia.CompareTo(_voti[k].Materia));
             break;
         default:
             throw new ArgumentOutOfRangeException("voce", voce, null);
     }
 }
 public Voti Ordina(TipoVoce voce)
 {
     for (var i = 0; i < _dimensione; i++)
     {
         var minimo = i;
         for (var j = i + 1; j < _dimensione; j++)
         {
             if (Confronta(voce, j, i) < 0)
                 minimo = j;
         }
         if (minimo != i)
             Scambia(minimo, i);
     }
     return this;
 }