コード例 #1
0
        public static LinkedListAdvertizers BuildFrom(List <Advertiser> advertisers)
        {
            LinkedListAdvertizers root    = null;
            LinkedListAdvertizers current = null;

            foreach (var advertiser in advertisers)
            {
                if (current != null)
                {
                    current.Next = new LinkedListAdvertizers {
                        Advertiser = advertiser, MissingRequeriments = advertiser.RequiredTagsCount
                    };
                    current = current.Next;
                }
                else
                {
                    current = new LinkedListAdvertizers {
                        Advertiser = advertiser, MissingRequeriments = advertiser.RequiredTagsCount
                    };
                    root = current;
                }
            }
            return(root);
        }
コード例 #2
0
        public Advertiser GetWinner(Bid bid, DateTime dateTime)
        {
            //used a linked list, to easily remove advertisers with rejected tags
            var list = LinkedListAdvertizers.BuildFrom(this.advertisersCache.GetCurrentAdvertisers());
            var prev = list;
            var curr = list;

            //iterate bid tags, remove from the list rejected advertisers and count every passing adv required tag
            for (int i = 0; i < bid.Tags.Count; i++)
            {
                Tag tag = bid.Tags[i];
                //var tagHash = tag.GetHashCode();
                while (curr != null)
                {
                    if (curr.Advertiser.RejectedTagsHashSetsFull.Contains(tag))
                    {
                        //found
                        if (list == curr)
                        {
                            list = curr.Next;
                            prev = curr.Next;
                            curr = curr.Next;
                            continue;
                        }
                        else
                        {
                            prev.Next = curr.Next;
                            curr      = curr.Next;
                            continue;
                        }
                    }

                    if (curr.Advertiser.RequiredTagsHashSetsFull.Contains(tag))
                    {
                        //found
                        curr.MissingRequeriments--;
                    }
                    prev = curr;
                    curr = curr.Next;
                    continue;
                }
                prev = list;
                curr = list;
            }

            //iterate results of full passing advertizers picking the best bet win, if any
            curr = list;
            Advertiser winner = null;

            while (curr != null)
            {
                if (curr.MissingRequeriments == 0)
                {
                    //list was previously sorted by CPM so this is the max bet for this requeriments.
                    winner = curr.Advertiser;
                    break;
                }
                curr = curr.Next;
            }
            return(winner);
        }