public static IEnumerable <RaceDetail> ToRaceDetails(this IEnumerable <Race> races, IEnumerable <Bet> bets) { foreach (var race in races) { if (bets == null) { yield break; } var raceBets = bets.Where(x => x.RaceId == race.Id); var newRaceDetail = new RaceDetail(race, raceBets) { HorseRaces = race.Horses.Select(x => { var raceBetsOnHorse = raceBets.Where(y => y.HorseId == x.Id).ToList(); var horseRace = new HorseRace { Horse = x, RaceId = race.Id, NumberOfBets = raceBetsOnHorse.Count, TotalBet = raceBetsOnHorse.Sum(i => i.Stake) }; horseRace.OwingOnWin = horseRace.TotalBet * x.Odds; return(horseRace); }) }; yield return(newRaceDetail); } }
public List <RaceBets> GetRaceDetails() { var result = new List <RaceBets>(); var races = GetAll(); var allBets = _betServices.GetAll().ToList(); foreach (var race in races) { var raceDetails = new RaceBets { Id = race.Id, Status = race.Status, Name = race.Name }; raceDetails.Bets = allBets.Where(x => x.RaceId == race.Id).ToList(); raceDetails.RaceTotalBet = raceDetails.Bets.Sum(x => x.Stake); foreach (var horse in race.Horses) { var thisRaceHorseBets = raceDetails.Bets.Where(x => x.HorseId == horse.Id).ToList(); var horseRace = new HorseRace { Horse = horse, RaceId = race.Id, NumberOfBets = thisRaceHorseBets.Count, TotalBet = thisRaceHorseBets.Sum(x => x.Stake) }; horseRace.OwingOnWin = horseRace.TotalBet * horseRace.Horse.Odds; raceDetails.HorseRaces.Add(horseRace); } result.Add(raceDetails); } return(result); }
public IEnumerator Scrolling() { float beginX; while (m_MsgQueue.Count > 0) { float duration = 10f; HorseRace horseRace = m_MsgQueue.Dequeue(); string msg = horseRace.msg; int loopTime = horseRace.loopTime; m_TxtMsg.text = msg; float txtWidth = m_TxtMsg.preferredWidth; float txtRectWidth = (float)0.5 * m_TxtMsg.rectTransform.rect.size.x; Vector3 pos = m_TxtMsg.rectTransform.localPosition; beginX = panelRight + txtRectWidth; float distance = txtWidth + panelWidth; float endRect = (float)0.5 * (txtRectWidth - panelWidth) - txtWidth; duration = distance / speed; isScrolling = true; while (loopTime-- > 0) { Debug.Log(loopTime); m_TxtMsg.rectTransform.localPosition = new Vector3(beginX, pos.y, pos.z); m_TxtMsg.rectTransform.DOLocalMoveX(endRect, duration).SetEase(Ease.Linear); yield return(new WaitForSeconds(duration)); } yield return(null); } isScrolling = false; gameObject.SetActive(false); }
public async Task <HorseRace> GetRaceDataAsync(string raceId) { var xmlText = await dataLoader.LoadDataAsync(raceId); if (string.IsNullOrWhiteSpace(xmlText)) { throw new RaceDataInvalidException("Empty document provided"); } var xdoc = XDocument.Parse(xmlText); var raceElements = xdoc.XPathSelectElements("/meeting/races/race"); var raceNode = raceElements.SingleOrDefault(); if (raceNode == null) { // TODO: ask the business or find the feed docs and determine if we might have multiple races. If so, this // would need to find the right way of identifying the correct race throw new RaceDataInvalidException("Expected 1 race in the source document"); } var race = new HorseRace() { RaceName = xdoc.XPathSelectElement("/meeting/track").Attribute("TranslatedName").Value, _horses = ParseHorses(raceNode) }; return(race); }
public async Task <HorseRace> GetRaceDataAsync(string raceId) { var jsonText = await dataLoader.LoadDataAsync(raceId); var model = JsonConvert.DeserializeObject <UkJsonRaceData>(jsonText); if (model?.RawData == null) { throw new RaceDataInvalidException("Source data missing RawData node"); } if (model.RawData.Markets?.Count != 1) { // TODO: what if there are multiple markets? do we treat them seperately or combine their selections together? Ask the business throw new RaceDataInvalidException("Expected 1 market"); } var market = model.RawData.Markets[0]; var race = new HorseRace() { RaceName = model.RawData.FixtureName, _horses = market.Selections.Select(s => new Horse() { HorseName = s.Tags.GetValueOrDefault("name"), Price = s.Price }).ToList() }; return(race); }
private Horse AddHorse(HorseRace race, Horse horse) { var addResult = race.AddHorse(horse); Assert.True(addResult, addResult.Message); return(horse); }
static void WriteRaceToConsoleInPriceOrder(HorseRace race) { Console.WriteLine("**********************"); Console.WriteLine("Race: " + race.RaceName); foreach (var horse in race.Horses.OrderBy(h => h.Price)) { Console.WriteLine($"Horse: {horse.HorseName}, Price: {horse.Price}"); } Console.WriteLine("**********************"); }
private static void Main(string[] args) { var race = new HorseRace(); new Menu <HorseRace>() .AddCommand(new PrintRaceInfo()) .AddCommand(new AddHorseCommand()) .AddCommand(new StartRaceCommand()) .Run(race); }
private void BrnRunRace_Click(object sender, EventArgs e) { HorseRace horseRace = new HorseRace(horses, 110, 140); if (horseRace.IsValidRace()) { TxtRaceWinner.Text = "The Winner Is :" + horseRace.Winner().HorseName; } else { MessageBox.Show("Margin Not Between 110% and 140%"); } }
public HorseRace GetHorseRace(object theDeserializedObj) { var aCaulfieldRaceFeed = theDeserializedObj as CaulfieldRaceFeed; if (aCaulfieldRaceFeed == null || aCaulfieldRaceFeed.Races == null || aCaulfieldRaceFeed.Races.Length == 0 || aCaulfieldRaceFeed.Races[0].Horses == null || aCaulfieldRaceFeed.Races[0].Horses.Length == 0 || aCaulfieldRaceFeed.Races[0].Prices == null || aCaulfieldRaceFeed.Races[0].Prices.Length == 0 || aCaulfieldRaceFeed.Races[0].Prices[0].HorsePrices == null || aCaulfieldRaceFeed.Races[0].Prices[0].HorsePrices.Length == 0) { return(null); } var aHourseRace = new HorseRace { Track = aCaulfieldRaceFeed.Track?.Name, Horses = new List <Horse>() }; var aHorseNumberPriceMapping = new Dictionary <int, decimal>(); foreach (var aHorsePrices in aCaulfieldRaceFeed.Races[0].Prices[0].HorsePrices) { aHorseNumberPriceMapping[aHorsePrices.Number] = aHorsePrices.Price; } foreach (var aCaulfieldHorse in aCaulfieldRaceFeed.Races[0].Horses) { if (aCaulfieldHorse.Name == null) { continue; } var aHorse = new Horse { Name = aCaulfieldHorse.Name }; aHourseRace.Horses.Add(aHorse); decimal aPrice; if (aHorseNumberPriceMapping.TryGetValue(aCaulfieldHorse.Number, out aPrice)) { aHorse.Price = aPrice; } } return(aHourseRace); }
public void TestMethod1() { List <Horse> horses = new List <Horse> { new Horse { HorseName = "A", Odd = 0.5 }, new Horse { HorseName = "B", Odd = 2 }, new Horse { HorseName = "C", Odd = 3 }, new Horse { HorseName = "D", Odd = 8 } }; int A = 0, B = 0, C = 0, D = 0; for (int x = 0; x < 1000000; x++) { HorseRace horseRace = new HorseRace(horses, 110, 140); Horse horse = horseRace.Winner(); switch (horse.HorseName) { case "A": A++; break; case "B": B++; break; case "C": C++; break; case "D": D++; break; } } Assert.IsTrue(A >= 460000 && A <= 500000); }
public HorseRace GetHorseRace(object theDeserializedObj) { var aWolferhamptonRaceFeed = theDeserializedObj as WolferhamptonRaceFeed; if (aWolferhamptonRaceFeed == null || aWolferhamptonRaceFeed.RawData == null || aWolferhamptonRaceFeed.RawData.Markets == null || aWolferhamptonRaceFeed.RawData.Markets.Length == 0 || aWolferhamptonRaceFeed.RawData.Markets[0].Selections == null || aWolferhamptonRaceFeed.RawData.Markets[0].Selections.Length == 0) { return(null); } var aHourseRace = new HorseRace { Track = aWolferhamptonRaceFeed.RawData?.Tags?.Track, Horses = new List <Horse>() }; foreach (var aSelection in aWolferhamptonRaceFeed.RawData.Markets[0].Selections) { if (aSelection.Tags == null || string.IsNullOrEmpty(aSelection.Tags.Name)) { continue; } var aHorse = new Horse { Name = aSelection.Tags.Name, Price = aSelection.Price }; aHourseRace.Horses.Add(aHorse); } return(aHourseRace); }
public void RunTest() { var race = new HorseRace(); var winners = new Dictionary <Horse, int>(); winners.Add(AddHorse(race, CreateHorse("FIRST", "1/2")), 1); winners.Add(AddHorse(race, CreateHorse("SECOND", "2/1")), 1); winners.Add(AddHorse(race, CreateHorse("THIRD", "3/1")), 1); winners.Add(AddHorse(race, CreateHorse("FOUR", "8/1")), 1); var raceCount = 1000000; for (var i = 0; i < raceCount; i++) { var winner = race.Start(); winners[winner]++; } foreach (var winner in winners) { AssertWinCount(winner.Key, winner.Value, race.Margin, raceCount); } }