private void updateKvalStatus(Propozicije propozicije) { if (!propozicije.odvojenoTak3()) { foreach (RezultatSpravaFinaleKupa r in Rezultati) { r.KvalStatus = KvalifikacioniStatus.None; } return; } List <RezultatSpravaFinaleKupa> rezultati = new List <RezultatSpravaFinaleKupa>(Rezultati); PropertyDescriptor propDesc = TypeDescriptor.GetProperties(typeof(RezultatSpravaFinaleKupa))["RedBroj"]; rezultati.Sort(new SortComparer <RezultatSpravaFinaleKupa>(propDesc, ListSortDirection.Ascending)); // moram da koristim dve mape zato sto je moguca situacija da klub i // drzava imaju isti id IDictionary <int, int> brojTakmicaraKlubMap = new Dictionary <int, int>(); IDictionary <int, int> brojTakmicaraDrzavaMap = new Dictionary <int, int>(); int finCount = 0; int rezCount = 0; for (int i = 0; i < rezultati.Count; i++) { RezultatSpravaFinaleKupa rezultat = rezultati[i]; if (rezultat.Total == null) { rezultat.KvalStatus = KvalifikacioniStatus.None; continue; } int id; IDictionary <int, int> brojTakmicaraMap; if (propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu) { if (rezultat.Gimnasticar.DrzavaUcesnik != null) { id = rezultat.Gimnasticar.DrzavaUcesnik.Id; brojTakmicaraMap = brojTakmicaraDrzavaMap; } else { id = rezultat.Gimnasticar.KlubUcesnik.Id; brojTakmicaraMap = brojTakmicaraKlubMap; } } else { if (rezultat.Gimnasticar.KlubUcesnik != null) { id = rezultat.Gimnasticar.KlubUcesnik.Id; brojTakmicaraMap = brojTakmicaraKlubMap; } else { id = rezultat.Gimnasticar.DrzavaUcesnik.Id; brojTakmicaraMap = brojTakmicaraDrzavaMap; } } if (!brojTakmicaraMap.ContainsKey(id)) { brojTakmicaraMap.Add(id, 0); } if (finCount < propozicije.BrojFinalistaTak3) { if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3) { finCount++; rezultat.KvalStatus = KvalifikacioniStatus.Q; } else { if (brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3) { finCount++; brojTakmicaraMap[id]++; rezultat.KvalStatus = KvalifikacioniStatus.Q; } else { if (Opcije.Instance.UzimajPrvuSlobodnuRezervu && rezCount < propozicije.BrojRezerviTak3) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { rezultat.KvalStatus = KvalifikacioniStatus.None; } } } } else if (rezCount < propozicije.BrojRezerviTak3) { if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { if (brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3) { rezCount++; brojTakmicaraMap[id]++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { if (Opcije.Instance.UzimajPrvuSlobodnuRezervu && rezCount < propozicije.BrojRezerviTak3) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { rezultat.KvalStatus = KvalifikacioniStatus.None; } } } } else { rezultat.KvalStatus = KvalifikacioniStatus.None; } } }
public static void updateKvalStatus <T>(Propozicije propozicije, IList <T> rezultatiList, DeoTakmicenjaKod deoTakKod, IsTotalNull <T> isTotalNull) where T : RezultatSprava { foreach (T r in rezultatiList) { r.KvalStatus = KvalifikacioniStatus.None; } if (deoTakKod != DeoTakmicenjaKod.Takmicenje1 || !propozicije.odvojenoTak3()) { return; } List <T> rezultati = new List <T>(rezultatiList); PropertyDescriptor propDesc = TypeDescriptor.GetProperties(typeof(T))["RedBroj"]; rezultati.Sort(new SortComparer <T>(propDesc, ListSortDirection.Ascending)); // moram da koristim dve mape zato sto je moguca situacija da klub i // drzava imaju isti id IDictionary <int, int> brojTakmicaraKlubMap = new Dictionary <int, int>(); IDictionary <int, int> brojTakmicaraDrzavaMap = new Dictionary <int, int>(); IDictionary <int, int> brojTakmicaraMap = null; int id = -1; int finCount = 0; int rezCount = 0; T prevFinRezultat = null; List <bool> porediDrzavu = new List <bool>(); for (int i = 0; i < rezultati.Count; i++) { T rezultat = rezultati[i]; if (isTotalNull(rezultat)) { rezultat.KvalStatus = KvalifikacioniStatus.None; continue; } if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3) { porediDrzavu.Add(false); if (propozicije.MaxBrojTakmicaraTak3VaziZaDrzavu) { if (rezultat.Gimnasticar.DrzavaUcesnik != null) { porediDrzavu[i] = true; id = rezultat.Gimnasticar.DrzavaUcesnik.Id; brojTakmicaraMap = brojTakmicaraDrzavaMap; } else { id = rezultat.Gimnasticar.KlubUcesnik.Id; brojTakmicaraMap = brojTakmicaraKlubMap; } } else { if (rezultat.Gimnasticar.KlubUcesnik != null) { id = rezultat.Gimnasticar.KlubUcesnik.Id; brojTakmicaraMap = brojTakmicaraKlubMap; } else { porediDrzavu[i] = true; id = rezultat.Gimnasticar.DrzavaUcesnik.Id; brojTakmicaraMap = brojTakmicaraDrzavaMap; } } if (!brojTakmicaraMap.ContainsKey(id)) { brojTakmicaraMap.Add(id, 0); } } if (finCount < propozicije.BrojFinalistaTak3 || rezultat.Rank == prevFinRezultat.Rank) { if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3 || brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3 || postojiIstiKvalRezultatIzKluba <T>(rezultat, rezultati, porediDrzavu)) { // Poslednji uslov u if naredbi znaci da je dostignut limit broja takmicara iz kluba, a medju // finalistima se nalazi i gimnasticar iz istog kluba koji ima istu ocenu. U tom slucaju moramo // da dodamo i ovog finalistu. TODO4: Da li u ovom slucaju treba da povecavamo finCount? (i kod // rezultata viseboja isto). finCount++; rezultat.KvalStatus = KvalifikacioniStatus.Q; prevFinRezultat = rezultat; if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3) { brojTakmicaraMap[id]++; } } else if (rezCount < propozicije.BrojRezerviTak3 && Opcije.Instance.UzimajPrvuSlobodnuRezervu) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { rezultat.KvalStatus = KvalifikacioniStatus.None; } } else if (rezCount < propozicije.BrojRezerviTak3) { if (propozicije.NeogranicenBrojTakmicaraIzKlubaTak3 || brojTakmicaraMap[id] < propozicije.MaxBrojTakmicaraIzKlubaTak3) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; if (!propozicije.NeogranicenBrojTakmicaraIzKlubaTak3) { brojTakmicaraMap[id]++; } } else if (Opcije.Instance.UzimajPrvuSlobodnuRezervu) { rezCount++; rezultat.KvalStatus = KvalifikacioniStatus.R; } else { rezultat.KvalStatus = KvalifikacioniStatus.None; } } else { // TODO: Uradi i za rezerve razresavanje situacije kada postoji vise rezervi sa identicnim // rezultatom (isto i za rezultate viseboj). rezultat.KvalStatus = KvalifikacioniStatus.None; } } }