private void creaGironiAndLoad(int idTorneo, int idDisciplina) { _dicFighter = new Dictionary <string, int>(); //loadToolStripMenuItem.Enabled = false; //Non permetto più di caricare i dati (in teoria va fatto meglio) //partecipantiTorneo = CaricaAtleti(); // i dati in lettura vanno fatti caricando la disciplina dal DB (divisione per disciplina) //se sono in presenza degli assoluti, per ora, carico i dati ordinati solo per ranking e senza random dei nomi all'interno delle ASD //partecipantiTorneo = assoluti == false ? // Helper.GetAtletiTorneoVsDisciplina(idTorneo, idDisciplina, categoria) : // Helper.GetAtletiTorneoVsDisciplinaAssoluti(idTorneo, idDisciplina, categoria); SqlDal_Pools.DeletePoolsAndMatches(idTorneo, idDisciplina); var partecipantiTorneo = SqlDal_Tournaments.GetAtletiTorneoVsDisciplinaAssoluti(idTorneo, idDisciplina); //TODO: da parametrizzare bool rankingEnabled = partecipantiTorneo.Sum(x => x.Ranking) != 0; numeroGironi = SqlDal_Pools.GetNumeroGironiByTorneoDisciplina(idTorneo, idDisciplina); if (numeroGironi > 0) { gironi = new List <List <AtletaEntity> >(); //Setting delle strutture dati for (int i = 0; i < numeroGironi; i++) { //Per ogni girone creo la lista, vuota al momento, dei partecipanti al girone stesso gironi.Add(new List <AtletaEntity>()); } //Inserisco ogni partecipante del torneo dentro la struttura dati dei gironi //e dell'albero nella posizione corrispondente //(l'abero deve essere visualizzato via WEB : quando ci clicchi ti deve far vedere la lista e lo stato degli incontri al suo interno int count = 0; if (!rankingEnabled) { foreach (AtletaEntity a in partecipantiTorneo) //ciclo sui gironi, e sulla lista atleti partecipanti al torneo, inserendo ogni atleta in un girone diverso, e poi rifacendo il giro { gironi[count].Add(a); if (count == numeroGironi - 1) { count = 0; } else { count++; } } } else { //qui ci va il codice per il calcolo dei gironi con gli assoluti int fasceAssoluti = 4; int atletiPerfascia = partecipantiTorneo.Count / fasceAssoluti; #region inizializziani 4 fasce List <AtletaEntity> primaFascia = new List <AtletaEntity>(); List <AtletaEntity> secondaFascia = new List <AtletaEntity>(); List <AtletaEntity> terzaFascia = new List <AtletaEntity>(); List <AtletaEntity> quartaFascia = new List <AtletaEntity>(); #endregion //primo quarto primaFascia.AddRange(partecipantiTorneo.GetRange(0, atletiPerfascia)); //secondo quarto secondaFascia.AddRange(partecipantiTorneo.GetRange(atletiPerfascia, atletiPerfascia)); //terzo quarto terzaFascia.AddRange(partecipantiTorneo.GetRange(2 * atletiPerfascia, atletiPerfascia)); //tutti i restanti quartaFascia.AddRange(partecipantiTorneo.GetRange(3 * atletiPerfascia, atletiPerfascia + (partecipantiTorneo.Count - (4 * atletiPerfascia)))); foreach (List <AtletaEntity> g in gironi) { //inserisco il primo atleta di ogni fascia nel girone i-esimo if (primaFascia.Count > 0) { g.Add(primaFascia.ElementAt(0)); } if (secondaFascia.Count > 0) { g.Add(secondaFascia.ElementAt(0)); } if (terzaFascia.Count > 0) { g.Add(terzaFascia.ElementAt(0)); } if (quartaFascia.Count > 0) { g.Add(quartaFascia.ElementAt(0)); } //elimino quell'atleta dalla lista dei papabili if (primaFascia.Count > 0) { primaFascia.RemoveAt(0); } if (secondaFascia.Count > 0) { secondaFascia.RemoveAt(0); } if (terzaFascia.Count > 0) { terzaFascia.RemoveAt(0); } if (quartaFascia.Count > 0) { quartaFascia.RemoveAt(0); } } //gestisco eventuali orfani : GIRONI da 5 //per sicurezza controllo tutte le fasce ma sarà solo la quarta ad avere degli orfani //che andaranno inseriti nei gironi già popolati a partire dal primo if (primaFascia.Count > 0 || secondaFascia.Count > 0 || terzaFascia.Count > 0 || quartaFascia.Count > 0) { foreach (List <AtletaEntity> g in gironi) { if (primaFascia.Count > 0) { g.Add(primaFascia.ElementAt(0)); primaFascia.RemoveAt(0); } else if (secondaFascia.Count > 0) { g.Add(secondaFascia.ElementAt(0)); secondaFascia.RemoveAt(0); } else if (terzaFascia.Count > 0) { g.Add(terzaFascia.ElementAt(0)); terzaFascia.RemoveAt(0); } else if (quartaFascia.Count > 0) { g.Add(quartaFascia.ElementAt(0)); quartaFascia.RemoveAt(0); } else { break; } } } } ///TODO ///per ogni girone devo creare la lsita corrispondente degli scontri ///- nuova struttura dati dei gironi/scontri che ogni posizione contiene una lista di incontri ///- tali incontri vanno salvati sul DB ///- tali incontri dovranno, in futuro, essere anche visualizzati via WEB /// gironiIncontri = new List <List <MatchEntity> >(); tabControlPool.Items.Clear(); Int32 idGirone = 1; foreach (List <AtletaEntity> g in gironi) { List <MatchEntity> matchList = null; if (g.Count == 4) { matchList = Helper.ElaborateT4(g); } else if (g.Count == 5) { matchList = Helper.ElaborateT5(g); } else if (g.Count == 6) { matchList = Helper.ElaborateT6(g); } gironiIncontri.Add(matchList); string title = "Girone " + (tabControlPool.Items.Count + 1).ToString(); tabControlPool.Items.Add(ElaboraTab(idTorneo, idDisciplina, title, g, matchList, tabControlPool.Items.Count + 1)); //TODO l'inserimento va fatto solo se già non è stato fatto, altrimenti vanno eliminati TUTTI i dati SqlDal_Pools.InserisciGironiIncontri(idTorneo, idDisciplina, matchList, idGirone); foreach (AtletaEntity a in g) { SqlDal_Pools.InsertAtletaInGirone(creaGironi.IdTorneo, creaGironi.IdDisciplina, idGirone, a.IdAtleta); } idGirone++; } EnablePageControls(); } else { MessageBox.Show("Si è verificato un errore durante il recupero delle informazioni sul numero dei gironi \r\nContattare un amministratore", "ERRORE Applicazione", MessageBoxButton.OK, MessageBoxImage.Error); } }