/// <summary> Sorts the <paramref name="menuItems"/> by their categories." </summary>
        /// <param name="menuItems"> Must not be <see langword="null"/> or contain items that are <see langword="null"/>. </param>
        /// <param name="generateSeparators"> <see langword="true"/> to generate a separator before starting a new category. </param>
        /// <returns> The <paramref name="menuItems"/>, sorted by their categories. </returns>
        public static WebMenuItem[] GroupMenuItems(WebMenuItem[] menuItems, bool generateSeparators)
        {
            ArgumentUtility.CheckNotNullOrItemsNull("menuItems", menuItems);

            //  <string category, ArrayList menuItems>
            NameObjectCollection groupedMenuItems = new NameObjectCollection();
            ArrayList            categories       = new ArrayList();

            for (int i = 0; i < menuItems.Length; i++)
            {
                WebMenuItem menuItem = menuItems[i];

                string    category = menuItem.Category ?? string.Empty;
                ArrayList menuItemsForCategory;
                if (groupedMenuItems.Contains(category))
                {
                    menuItemsForCategory = (ArrayList)groupedMenuItems[category];
                }
                else
                {
                    menuItemsForCategory = new ArrayList();
                    groupedMenuItems.Add(category, menuItemsForCategory);
                    categories.Add(category);
                }
                menuItemsForCategory.Add(menuItem);
            }

            ArrayList arrayList = new ArrayList();
            bool      isFirst   = true;

            for (int i = 0; i < categories.Count; i++)
            {
                string category = (string)categories[i];
                if (generateSeparators)
                {
                    if (isFirst)
                    {
                        isFirst = false;
                    }
                    else
                    {
                        arrayList.Add(WebMenuItem.GetSeparator());
                    }
                }
                arrayList.AddRange((ArrayList)groupedMenuItems[category]);
            }
            return((WebMenuItem[])arrayList.ToArray(typeof(WebMenuItem)));
        }