///<summary>
        /// Creates an exact copy of this VList{T} object.
        ///</summary>
        ///<returns>A new, identical copy of the VList{T}.</returns>
        public virtual VList <T> Copy()
        {
            VList <T> copy = new VList <T>();

            foreach (T item in this)
            {
                T itemCopy = (T)MakeCopyOf(item);
                copy.Add(itemCopy);
            }
            return(copy);
        }
        ///<summary>
        /// Finds a collection of <see cref="IEntity" /> objects in the current list matching the search criteria.
        ///</summary>
        /// <param name="findAllByType"><see cref="FindAllByType" /> Type to easily search by</param>
        /// <param name="propertyName">Property of the object to search.</param>
        /// <param name="value">Value to find.</param>
        /// <param name="ignoreCase">A Boolean indicating a case-sensitive or insensitive comparison (true indicates a case-insensitive comparison).  String properties only.</param>
        public virtual VList <T> FindAllBy(FindAllByType findAllByType, string propertyName, object value, bool ignoreCase)
        {
            PropertyDescriptorCollection props    = base.PropertyCollection;
            PropertyDescriptor           searchBy = props.Find(propertyName, true);

            VList <T> result = new VList <T>();

            int index = 0;

            while (index > -1)
            {
                index = this.FindAllBy(findAllByType, searchBy, value, index, ignoreCase);

                if (index > -1)
                {
                    result.Add(this[index]);

                    //Increment the index to start at the next item
                    index++;
                }
            }

            return(result);
        }