Inheritance: Criterion
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">Id of the campaign to which targeting criteria
        /// are added.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the CampaignCriterionService.
              CampaignCriterionService campaignCriterionService =
              (CampaignCriterionService) user.GetService(
              AdWordsService.v201306.CampaignCriterionService);

              // Create language criteria.
              // See http://code.google.com/apis/adwords/docs/appendix/languagecodes.html
              // for a detailed list of language codes.
              Language language1 = new Language();
              language1.id = 1002; // French
              CampaignCriterion languageCriterion1 = new CampaignCriterion();
              languageCriterion1.campaignId = campaignId;
              languageCriterion1.criterion = language1;

              Language language2 = new Language();
              language2.id = 1005; // Japanese
              CampaignCriterion languageCriterion2 = new CampaignCriterion();
              languageCriterion2.campaignId = campaignId;
              languageCriterion2.criterion = language2;

              // Create location criteria.
              // See http://code.google.com/apis/adwords/docs/appendix/countrycodes.html
              // for a detailed list of country codes.
              Location location1 = new Location();
              location1.id = 2840; // USA
              CampaignCriterion locationCriterion1 = new CampaignCriterion();
              locationCriterion1.campaignId = campaignId;
              locationCriterion1.criterion = location1;

              Location location2 = new Location();
              location2.id = 2392; // Japan
              CampaignCriterion locationCriterion2 = new CampaignCriterion();
              locationCriterion2.campaignId = campaignId;
              locationCriterion2.criterion = location2;

              // Add a negative campaign placement.
              NegativeCampaignCriterion negativeCriterion = new NegativeCampaignCriterion();
              negativeCriterion.campaignId = campaignId;

              Placement placement = new Placement();
              placement.url = "http://mars.google.com";

              negativeCriterion.criterion = placement;

              CampaignCriterion[] criteria = new CampaignCriterion[] {languageCriterion1,
              languageCriterion2, locationCriterion1, locationCriterion2, negativeCriterion};

              List<CampaignCriterionOperation> operations = new List<CampaignCriterionOperation>();

              foreach (CampaignCriterion criterion in criteria) {
            CampaignCriterionOperation operation = new CampaignCriterionOperation();
            operation.@operator = Operator.ADD;
            operation.operand = criterion;
            operations.Add(operation);
              }

              try {
            // Set the campaign targets.
            CampaignCriterionReturnValue retVal = campaignCriterionService.mutate(operations.ToArray());

            if (retVal != null && retVal.value != null) {
              // Display campaign targets.
              foreach (CampaignCriterion criterion in retVal.value) {
            Console.WriteLine("Campaign criteria of type '{0}' was set to campaign with" +
                " id = '{1}'.", criterion.criterion.CriterionType, criterion.campaignId);
              }
            }
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to set Campaign criteria.", ex);
              }
        }
 /// <summary>
 /// Gets a string representation for a location.
 /// </summary>
 /// <param name="location">The location</param>
 /// <returns>The string representation</returns>
 public string GetLocationString(Location location)
 {
     return string.Format("{0} ({1})", location.locationName, location.displayType);
 }
        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        public void Run(AdWordsUser user)
        {
            // Get the TrafficEstimatorService.
              TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService) user.GetService(
              AdWordsService.v201306.TrafficEstimatorService);

              // Create keywords. Up to 2000 keywords can be passed in a single request.
              Keyword keyword1 = new Keyword();
              keyword1.text = "mars cruise";
              keyword1.matchType = KeywordMatchType.BROAD;

              Keyword keyword2 = new Keyword();
              keyword2.text = "cheap cruise";
              keyword2.matchType = KeywordMatchType.PHRASE;

              Keyword keyword3 = new Keyword();
              keyword3.text = "cruise";
              keyword3.matchType = KeywordMatchType.EXACT;

              Keyword[] keywords = new Keyword[] {keyword1, keyword2, keyword3};

              // Create a keyword estimate request for each keyword.
              List<KeywordEstimateRequest> keywordEstimateRequests = new List<KeywordEstimateRequest>();

              foreach (Keyword keyword in keywords) {
            KeywordEstimateRequest keywordEstimateRequest = new KeywordEstimateRequest();
            keywordEstimateRequest.keyword = keyword;
            keywordEstimateRequests.Add(keywordEstimateRequest);
              }

              // Create negative keywords.
              Keyword negativeKeyword1 = new Keyword();
              negativeKeyword1.text = "moon walk";
              negativeKeyword1.matchType = KeywordMatchType.BROAD;

              KeywordEstimateRequest negativeKeywordEstimateRequest = new KeywordEstimateRequest();
              negativeKeywordEstimateRequest.keyword = negativeKeyword1;
              negativeKeywordEstimateRequest.isNegative = true;
              keywordEstimateRequests.Add(negativeKeywordEstimateRequest);

              // Create ad group estimate requests.
              AdGroupEstimateRequest adGroupEstimateRequest = new AdGroupEstimateRequest();
              adGroupEstimateRequest.keywordEstimateRequests = keywordEstimateRequests.ToArray();
              adGroupEstimateRequest.maxCpc = new Money();
              adGroupEstimateRequest.maxCpc.microAmount = 1000000;

              // Create campaign estimate requests.
              CampaignEstimateRequest campaignEstimateRequest = new CampaignEstimateRequest();
              campaignEstimateRequest.adGroupEstimateRequests = new AdGroupEstimateRequest[] {
              adGroupEstimateRequest};

              // See http://code.google.com/apis/adwords/docs/appendix/countrycodes.html
              // for a detailed list of country codes.
              Location countryCriterion = new Location();
              countryCriterion.id = 2840; //US

              // See http://code.google.com/apis/adwords/docs/appendix/languagecodes.html
              // for a detailed list of language codes.
              Language languageCriterion = new Language();
              languageCriterion.id = 1000; //en

              campaignEstimateRequest.criteria = new Criterion[] {countryCriterion, languageCriterion};

              // Create the selector.
              TrafficEstimatorSelector selector = new TrafficEstimatorSelector();
              selector.campaignEstimateRequests = new CampaignEstimateRequest[] {campaignEstimateRequest};

              try {
            // Get traffic estimates.
            TrafficEstimatorResult result = trafficEstimatorService.get(selector);

            // Display traffic estimates.
            if (result != null && result.campaignEstimates != null &&
            result.campaignEstimates.Length > 0) {
              CampaignEstimate campaignEstimate = result.campaignEstimates[0];
              if (campaignEstimate.adGroupEstimates != null &&
              campaignEstimate.adGroupEstimates.Length > 0) {
            AdGroupEstimate adGroupEstimate = campaignEstimate.adGroupEstimates[0];

            if (adGroupEstimate.keywordEstimates != null) {
              for (int i = 0; i < adGroupEstimate.keywordEstimates.Length; i++) {
                Keyword keyword = keywordEstimateRequests[i].keyword;
                KeywordEstimate keywordEstimate = adGroupEstimate.keywordEstimates[i];

                if (keywordEstimateRequests[i].isNegative) {
                  continue;
                }

                // Find the mean of the min and max values.
                long meanAverageCpc = (keywordEstimate.min.averageCpc.microAmount
                    + keywordEstimate.max.averageCpc.microAmount) / 2;
                double meanAveragePosition = (keywordEstimate.min.averagePosition
                    + keywordEstimate.max.averagePosition) / 2;
                float meanClicks = (keywordEstimate.min.clicksPerDay
                   + keywordEstimate.max.clicksPerDay) / 2;
                long meanTotalCost = (keywordEstimate.min.totalCost.microAmount
                   + keywordEstimate.max.totalCost.microAmount) / 2;

               Console.WriteLine("Results for the keyword with text = '{0}' and match type = " +
                    "'{1}':", keyword.text, keyword.matchType);
               Console.WriteLine("  Estimated average CPC: {0}", meanAverageCpc);
               Console.WriteLine("  Estimated ad position: {0:0.00}", meanAveragePosition);
               Console.WriteLine("  Estimated daily clicks: {0}", meanClicks);
               Console.WriteLine("  Estimated daily cost: {0}", meanTotalCost);
              }
            }
              }
            } else {
              Console.WriteLine("No traffic estimates were returned.\n");
            }
              } catch (Exception ex) {
            throw new System.ApplicationException("Failed to retrieve traffic estimates.", ex);
              }
        }