/// <summary>
        /// Update user activity metrics with data from a collection of skeletons.
        /// </summary>
        /// <param name="skeletons">
        /// Collection of skeletons to use to update activity metrics.
        /// </param>
        /// <param name="timestamp">
        /// Time when skeleton array was received for processing.
        /// </param>
        /// <remarks>
        /// UserActivityMeter assumes that this method is called regularly, e.g.: once
        /// per skeleton frame received by application, so if a user whose activity was
        /// previously measured is now absent, activity record will be removed.
        /// </remarks>
        public void Update(ICollection<Skeleton> skeletons, long timestamp)
        {
            foreach (var skeleton in skeletons)
            {
                UserActivityRecord record;

                if (this.activityRecords.TryGetValue(skeleton.TrackingId, out record))
                {
                    record.Update(skeleton.Position, this.totalUpdatesSoFar, timestamp);
                }
                else
                {
                    record = new UserActivityRecord(skeleton.Position, this.totalUpdatesSoFar, timestamp);
                    this.activityRecords[skeleton.TrackingId] = record;
                }
            }

            // Remove activity records corresponding to users that are no longer being tracked
            var idsToRemove = new List<int>();
            foreach (var record in this.activityRecords)
            {
                if (record.Value.LastUpdateId != this.totalUpdatesSoFar)
                {
                    idsToRemove.Add(record.Key);
                }
            }

            foreach (var id in idsToRemove)
            {
                this.activityRecords.Remove(id);
            }

            ++this.totalUpdatesSoFar;
        }
        /// <summary>
        /// Update user activity metrics with data from a collection of skeletons.
        /// </summary>
        /// <param name="skeletons">
        /// Collection of skeletons to use to update activity metrics.
        /// </param>
        /// <param name="timestamp">
        /// Time when skeleton array was received for processing.
        /// </param>
        /// <remarks>
        /// UserActivityMeter assumes that this method is called regularly, e.g.: once
        /// per skeleton frame received by application, so if a user whose activity was
        /// previously measured is now absent, activity record will be removed.
        /// </remarks>
        public void Update(ICollection <Skeleton> skeletons, long timestamp)
        {
            foreach (var skeleton in skeletons)
            {
                UserActivityRecord record;

                if (this.activityRecords.TryGetValue(skeleton.TrackingId, out record))
                {
                    record.Update(skeleton.Position, this.totalUpdatesSoFar, timestamp);
                }
                else
                {
                    record = new UserActivityRecord(skeleton.Position, this.totalUpdatesSoFar, timestamp);
                    this.activityRecords[skeleton.TrackingId] = record;
                }
            }

            // Remove activity records corresponding to users that are no longer being tracked
            var idsToRemove = new List <int>();

            foreach (var record in this.activityRecords)
            {
                if (record.Value.LastUpdateId != this.totalUpdatesSoFar)
                {
                    idsToRemove.Add(record.Key);
                }
            }

            foreach (var id in idsToRemove)
            {
                this.activityRecords.Remove(id);
            }

            ++this.totalUpdatesSoFar;
        }
 /// <summary>
 /// Gets the activity record associated with the specified user.
 /// </summary>
 /// <param name="userTrackingId">
 /// Skeleton tracking Id of user associated with the activity record to
 /// retrieve.
 /// </param>
 /// <param name="record">
 /// [out] When this method returns, contains the record associated with the
 /// specified user tracking Id, if the appropriate activity record is found.
 /// This parameter is passed uninitialized.
 /// </param>
 /// <returns>
 /// <code>true</code> if the UserActivityMeter contains an activity record
 /// for the specified user tracking Id; otherwise, <code>false</code>.
 /// </returns>
 public bool TryGetActivityRecord(int userTrackingId, out UserActivityRecord record)
 {
     return(this.activityRecords.TryGetValue(userTrackingId, out record));
 }
 /// <summary>
 /// Gets the activity record associated with the specified user.
 /// </summary>
 /// <param name="userTrackingId">
 /// Skeleton tracking Id of user associated with the activity record to
 /// retrieve.
 /// </param>
 /// <param name="record">
 /// [out] When this method returns, contains the record associated with the
 /// specified user tracking Id, if the appropriate activity record is found.
 /// This parameter is passed uninitialized.
 /// </param>
 /// <returns>
 /// <code>true</code> if the UserActivityMeter contains an activity record
 /// for the specified user tracking Id; otherwise, <code>false</code>.
 /// </returns>
 public bool TryGetActivityRecord(int userTrackingId, out UserActivityRecord record)
 {
     return this.activityRecords.TryGetValue(userTrackingId, out record);
 }