• User

    Semplificare codice if

    Ciao, io nel mio codice di un'applicazione ASP.NET devo inserire diversi "if", un centinaio. Ci sarebbero delle soluzioni per semplificare il codice in caso di una gran quantità di "if" senza perdere prestazioni?

    Grazie


  • Moderatore
    
    if(a==0)
       {
          ...
       }
    else
       {
          ...
       }
    
    ``` può essere sostituito da 
    

    switch(a)
    {
    case 0:
    ...
    break
    case 1:
    ...
    break
    }

    
    Forse però, se puoi spiegare oppure postare il codice possiamo aiutarti a ragionare su di un approccio differente all'if

  • User

    Io ad esempio ho questo codice con due If "principali" cioè quelli che vorrei semplificare cbsc1 e cbsc2:

                    if (cbsc1 ?? false)
                    { 
                        if (raceInfo.Hdr.Contains("Huntingdon"))
                        {
                            horses = (from a in horses
                                      where a.Race.Course == "Wor" || a.Race.Course == "Ling"
                                      // where a.Race.RaceDate.Date == DateTime.Now.Date
                                      select a).ToList();
                        }
                    }
                    if (cbsc2 ?? false)
                    {
                        if (raceInfo.Hdr.Contains("Newcastle"))
                        {
                            horses = (from a in horses
                                      where a.Race.Course == "Ayr" || a.Race.Course == "Nkt"
                                      // where a.Race.RaceDate.Date == DateTime.Now.Date
                                      select a).ToList();
                        }
                    }
    

    Io ne dovrei fare un centinaio di if cbsc1 e cbsc2, dove cambiano solo i valori di raceInfo.Hdr.Contains e where a.Race.Course ==. Non ci sono soluzioni che mantengano le prestazioni, esempio un array o qualcosa del genere?


  • Moderatore

    Se mi spieghi qual'è la logica è possibile che si risolva tutto nel Database...

    Dentro gli iif principali cerchi di recuperare tutti i cavalli che hanno corso alcune determinate gare in funzione di ciò che è contenuto in Hdr...
    Quindi abbiamo una tabella delle gare legate ai Cavalli.
    Puoi mettere in un ulteriore tabella gli Hdr e legarli alle gare?

    Poi se mi spieghi cosa sono i cbsc magari diamo un posto anche a loro


  • User

    Io ho un centinaio di corse "raceInfo.Hdr.Contains". Per ogni corsa ho cbsc1 e cbsc2 che sono dei filtri (checkbox nella mia tabella).
    Per ogni corsa filtro delle altre corse "where a.Race.Course == "corsa1"" "where a.Race.Course == "corsa2"" ecc

    Esempio

    Nome corsa
    Huntingdon cbsc1 Wor Ling
    Huntingdon cbsc2 Ayr Nkt
    Newcastle cbsc1 Nkt Ling
    Newcastle cbsc2 Wor Ayr
    e così avanti..

    Quindi, quando ho la corsa Huntingdon e seleziono il filtro cbsc1 visualizzo solo le righe contententi "Wor" "Ling" e avanti così..

    Ciò che vorrei sarebbe una semplificazione del codice, ma SENZA perdene in prestazioni (velocità) nel filtrare le corse.

    Gli IF sono l'unica soluzione? Sono quelli che come prestazioni sono più veloci? O ci sono altri modi?


  • Moderatore

    Lo schema
    Huntingdon | 1 | 'Wor' or 'Ling'
    Huntingdon | 2 | 'Ayr' or 'Nkt'
    Newcastle | 1 | 'Nkt' or 'Ling'
    Newcastle | 2 | 'Wor' or 'Ayr'

    è predefinito?

    Se sì immagina il seguente scenario:
    Costruisci una tabella [RelationShipCourse] con lo schema qui sopra dove avrai le colonne

    AltraCorsaID(int)|cbsc(byte)|CorsaID(int)

    Un'altra tabella [AltraCorsa] conterrà le Corse della prima colonna: AltraCorsaID(int)|AltraCorsa(varchar(50)). Quindi sulla pagina avrai una DropDownList [DdlAltraCorsa] con tutte le altre corse di questa tabella che hanno un riferimento nella tabella precedente e le due CheckBox precedenti, cbsc1 e cbsc2.

    La query sarà più o meno così:

    
    var cbsc = 0;
    if (cbsc1 ?? false) cbsc = 1;
    if (cbsc2 ?? false) cbsc = 2;
    
    horses = (from r in Race
                  where r.RelationShipCourse.AltraCorsaID == DdlAltraCorsa.SelectedValue
                      && r.RelationShipCourse.cbsc == cbsc 
                                      select r.horses).ToList();
    
    

    Probabilmente se la scrivi as is anche costruendo le tabelle non funzionerà, ma secondo me è la strada più corretta, fai fare il lavoro di relazione a SQL, altrimenti perché si chiamerebbe Relational Database?