/// <summary> /// Resolves auctions for each site's units and stores the results in AuctionResults /// </summary> public void RunAuctions() { AuctionResults.Clear(); List <string> validSites = new List <string>(MyConfig.Sites.Keys); Auctions = Auctions.Select(auction =>//removes bids from invalid sites, that way the results will be empty { if (!validSites.Contains(auction.Site)) { auction.Bids.Clear(); } return(auction); }).ToList(); //would have but this below, but it makes it look terrible AuctionResults = Auctions.Select(auction => //foreach auction auction.Units.Select(unit => //foreach unit auction.Bids.Where(bid => bid.Unit == unit && //valid units MyConfig.Sites[auction.Site].Bidders.Contains(bid.Bidder) && //valid bidders GetAdjustedBid(bid) >= MyConfig.Sites[auction.Site].Floor) //valid minimum bid. Invalid sites had their bids culled, so no need to worry about indexing exceptions .OrderByDescending(bid => GetAdjustedBid(bid)) .Select(bid => bid) //new AuctionUnitResult(bid.Bidder, bid.BidAmt, bid.Unit)) .FirstOrDefault() //Winning bid in a unit. //From what I understand, linq does not waste time converting the other items in the above .Select, only the first. ).Where(unitRes => unitRes != null).ToList() //winning bid for each unit. Ignores ones that did not have a winner, aka null results ).ToList(); //will keep empty auctions }