public override bool Equals(object obj)
        {
            if (obj == null || GetType() != obj.GetType())
            {
                return(false);
            }

            TraceAggregationKey traceAggregationKey = (TraceAggregationKey)obj;

            return
                (this.TaskName == traceAggregationKey.TaskName &&
                 this.EventName == traceAggregationKey.EventName &&
                 this.DifferentiatorFieldName == traceAggregationKey.DifferentiatorFieldName &&
                 this.DifferentiatorFieldValue == traceAggregationKey.DifferentiatorFieldValue);
        }
        public void Aggregate(TraceAggregationConfig traceAggregationConfig, string diffFieldValueString, IEnumerable <KeyValuePair <string, double> > numericalFields, IEnumerable <KeyValuePair <string, string> > stringFields, DateTime timestamp)
        {
            TraceAggregator     traceAggregator;
            TraceAggregationKey traceAggregationKey = new TraceAggregationKey(traceAggregationConfig, diffFieldValueString);

            if (!this.telemetryAggregationCollection.TryGetValue(traceAggregationKey, out traceAggregator))
            {
                // initializes the aggregator for the first time the trace is seen
                traceAggregator = new TraceAggregator(traceAggregationConfig);

                // include the aggregator to the collection
                this.telemetryAggregationCollection[traceAggregationKey] = traceAggregator;
            }

            // aggregating field values
            traceAggregator.Aggregate(numericalFields);
            traceAggregator.Aggregate(stringFields);
            traceAggregator.TraceTimestamp = timestamp;
        }