/// <summary>
        /// Add default file ordering for common popuular script and style libraries.
        /// </summary>
        /// <param name="list">A collection of <see cref="BundleFileSetOrdering"/> objects to populate with default values.</param>
        /// <remarks>
        /// The purpose for applying these default file ordering values is to ensure that common libraries such as jquery are always located
        /// at or close to the top within a bundle. These values can be all removed with <see cref="ResetAll"/>.
        ///
        /// The default ordering values are as follows:
        /// <list type="bullet">
        ///     <item><description>reset.css</description></item>
        ///     <item><description>normalize.css</description></item>
        ///     <item><description>jquery.js</description></item>
        ///     <item><description>jquery-min.js</description></item>
        ///     <item><description>jquery-*</description></item>
        ///     <item><description>jquery-ui*</description></item>
        ///     <item><description>jquery.ui*</description></item>
        ///     <item><description>jquery.unobtrusive*</description></item>
        ///     <item><description>jquery.validate*</description></item>
        ///     <item><description>modernizr-*</description></item>
        ///     <item><description>dojo.*</description></item>
        ///     <item><description>mootools-core*</description></item>
        ///     <item><description>mootools-*</description></item>
        ///     <item><description>prototype.js</description></item>
        ///     <item><description>prototype-*</description></item>
        ///     <item><description>scriptaculous-*</description></item>
        ///     <item><description>ext.js</description></item>
        ///     <item><description>ext-*</description></item>
        /// </list>
        /// </remarks>
        public static void AddDefaultFileOrderings(IList <BundleFileSetOrdering> list)
        {
            if (list == null)
            {
                throw new ArgumentNullException("list");
            }

            BundleFileSetOrdering css = new BundleFileSetOrdering("css");

            css.Files.Add("reset.css");
            css.Files.Add("normalize.css");
            list.Add(css);

            BundleFileSetOrdering jquery = new BundleFileSetOrdering("jquery");

            jquery.Files.Add("jquery.js");
            jquery.Files.Add("jquery-min.js");
            jquery.Files.Add("jquery-*");
            jquery.Files.Add("jquery-ui*");
            jquery.Files.Add("jquery.ui*");
            jquery.Files.Add("jquery.unobtrusive*");
            jquery.Files.Add("jquery.validate*");
            list.Add(jquery);

            BundleFileSetOrdering mod = new BundleFileSetOrdering("modernizr");

            mod.Files.Add("modernizr-*");
            list.Add(mod);

            BundleFileSetOrdering dojo = new BundleFileSetOrdering("dojo");

            dojo.Files.Add("dojo.*");
            list.Add(dojo);

            BundleFileSetOrdering moo = new BundleFileSetOrdering("moo");

            moo.Files.Add("mootools-core*");
            moo.Files.Add("mootools-*");
            list.Add(moo);

            BundleFileSetOrdering proto = new BundleFileSetOrdering("prototype");

            proto.Files.Add("prototype.js");
            proto.Files.Add("prototype-*");
            proto.Files.Add("scriptaculous-*");
            list.Add(proto);

            BundleFileSetOrdering ext = new BundleFileSetOrdering("ext");

            ext.Files.Add("ext.js");
            ext.Files.Add("ext-*");
            list.Add(ext);
        }
        private static void AddOrderingFiles(BundleFileSetOrdering ordering, IEnumerable <BundleFile> files, Dictionary <string, HashSet <BundleFile> > fileMap, HashSet <VirtualFile> foundFiles, List <BundleFile> result)
        {
            foreach (string fileName in ordering.Files)
            {
                // If the file ends in a wildcard we need to do special logic
                if (fileName.EndsWith("*", StringComparison.OrdinalIgnoreCase))
                {
                    // Adds all files that match the prefix of the filename (i.e. jquery-*)
                    string prefix = fileName.Substring(0, fileName.Length - 1);

                    // iterate thru all the files and add matches
                    var matchedFiles = files.Where(f => !foundFiles.Contains(f.VirtualFile) && f.VirtualFile.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase));
                    foreach (BundleFile f in matchedFiles)
                    {
                        result.Add(f);
                        foundFiles.Add(f.VirtualFile);
                    }
                }
                else
                {
                    if (fileMap.ContainsKey(fileName))
                    {
                        // Sort the hashed files to guarantee an ordering
                        List <BundleFile> sortedFiles = new List <BundleFile>(fileMap[fileName]);
                        sortedFiles.Sort(BundleFileComparer.Instance);
                        foreach (BundleFile fi in sortedFiles)
                        {
                            if (!foundFiles.Contains(fi.VirtualFile))   // Only add the file to the bundle once
                            {
                                result.Add(fi);
                                foundFiles.Add(fi.VirtualFile);
                            }
                        }
                    }
                }
            }
        }