/// <summary>
        /// Merges dictionaries
        /// </summary>
        /// <typeparam name="TK">The type of the tk.</typeparam>
        /// <typeparam name="TV">The type of the tv.</typeparam>
        /// <param name="mergeTechnique">The merge technique.</param>
        /// <param name="dictionaries">The dictionaries.</param>
        /// <returns>Dictionary&lt;TK, TV&gt;.</returns>
        /// <exception cref="System.ArgumentException">Invalid or unsupported Merge Technique - mergeTechnique</exception>
        public static IDictionary <TK, TV> Merge <TK, TV>(MergeTechnique mergeTechnique, params IDictionary <TK, TV>[] dictionaries)
        {
            switch (mergeTechnique)
            {
            case MergeTechnique.Unique:
                return(MergeUnique(dictionaries));

            case MergeTechnique.TakeFirst:
                return(MergeFirst(dictionaries));

            case MergeTechnique.TakeLast:
                return(MergeLast(dictionaries));

            default:
                throw new EnumValueException <MergeTechnique>(mergeTechnique);
            }
        }
        /// <summary>
        /// Merges this dictionary with another one
        /// </summary>
        /// <typeparam name="TK">The type of the tk.</typeparam>
        /// <typeparam name="TV">The type of the tv.</typeparam>
        /// <param name="dict">The dictionary.</param>
        /// <param name="other">The other.</param>
        /// <param name="mergeTechnique">The merge technique.</param>
        /// <returns>Dictionary&lt;TK, TV&gt;.</returns>
        /// <remarks>Source and target dictionaries are left untouched</remarks>
        public static IDictionary <TK, TV> MergeWith <TK, TV>(this IDictionary <TK, TV> dict, IDictionary <TK, TV> other, MergeTechnique mergeTechnique = MergeTechnique.Unique)
        {
            var result = Merge(mergeTechnique, dict, other);

            return(result);
        }
        /// <summary>
        /// Create a Dictionary from a NameValueCollection
        /// </summary>
        /// <param name="collection">The collection.</param>
        /// <param name="mergeTechnique">The merge technique.</param>
        /// <returns>IDictionary&lt;System.String, System.String&gt;.</returns>
        public static IDictionary <string, string> ToDictionary(this NameValueCollection collection, MergeTechnique mergeTechnique)
        {
            var dictionaries = new List <IDictionary <string, string> >();

            for (var i = 0; i < collection.Count; ++i)
            {
                var key    = collection.GetKey(i);
                var values = collection.GetValues(i) ?? Enumerable.Empty <string>();

                foreach (var value in values)
                {
                    var dict = new Dictionary <string, string>()
                    {
                        { key, value }
                    };

                    dictionaries.Add(dict);
                }
            }

            return(DictionaryExtensions.Merge(mergeTechnique, dictionaries.ToArray()));
        }