/// <summary>
        /// Perform a deep copy of this metadata collection.
        /// </summary>
        /// <returns>
        /// Returns a deep copy of this metadata collection.
        /// </returns>
        public IGalleryObjectMetadataItemCollection Copy()
        {
            IGalleryObjectMetadataItemCollection metaDataItemCollectionCopy = new GalleryObjectMetadataItemCollection();

            foreach (IGalleryObjectMetadataItem metaDataItem in this.Items)
            {
                metaDataItemCollectionCopy.Add(metaDataItem.Copy());
            }

            return(metaDataItemCollectionCopy);
        }
        /// <summary>
        /// Gets the items in the collection that are visible to the UI. That is, get the items where <see cref="IGalleryObjectMetadataItem.IsVisible" />
        /// = <c>true</c>.
        /// </summary>
        /// <returns>Returns a list of items that are visible to the UI.</returns>
        public IGalleryObjectMetadataItemCollection GetVisibleItems()
        {
            // We know galleryObjectMetadataItems is actually a List<IGalleryObjectMetadataItem> because we passed it to the constructor.
            List <IGalleryObjectMetadataItem>    galleryObjectMetadataItems = (List <IGalleryObjectMetadataItem>)Items;
            IGalleryObjectMetadataItemCollection metadataItemsCollection    = new GalleryObjectMetadataItemCollection();

            galleryObjectMetadataItems.ForEach(delegate(IGalleryObjectMetadataItem metaItem)
            {
                if (metaItem.IsVisible)
                {
                    metadataItemsCollection.Add(metaItem);
                }
            });

            return(metadataItemsCollection);
        }
        /// <summary>
        /// Get a list of items whose metadata must be persisted to the data store, either because it has been added or because
        /// it has been modified. All IGalleryObjectMetadataItem whose HasChanges property are true are returned. This is called during a
        /// save operation to indicate which metadata items must be saved. Guaranteed to not return null. If no items
        /// are found, an empty collection is returned.
        /// </summary>
        /// <returns>
        /// Returns a list of items whose metadata must be updated with the metadata currently in the media object's file.
        /// </returns>
        public IGalleryObjectMetadataItemCollection GetItemsToSave()
        {
            // We know galleryObjectMetadataItems is actually a List<IGalleryObjectMetadataItem> because we passed it to the constructor.
            var galleryObjectMetadataItems = (List <IGalleryObjectMetadataItem>)Items;
            IGalleryObjectMetadataItemCollection metadataItemsCollection = new GalleryObjectMetadataItemCollection();

            galleryObjectMetadataItems.ForEach(delegate(IGalleryObjectMetadataItem metaItem)
            {
                if (metaItem.HasChanges)
                {
                    metadataItemsCollection.Add(metaItem);
                }
            });

            return(metadataItemsCollection);
        }