private static IDictionary <string, PackageItem <T> > GroupItems <T>(IEnumerable <T> items, IDictionary <string, PackageItemDetail> packages)
        {
            var result       = new SortedDictionary <string, PackageItem <T> >();
            var otherPackage = new PackageItemDetail {
                Name = "Other", Assembly = string.Empty
            };

            if (items != null)
            {
                foreach (var item in items)
                {
                    PackageItemDetail package;
                    if (!packages.TryGetValue(item.GetType().Assembly.FullName, out package))
                    {
                        package = otherPackage;
                    }

                    PackageItem <T> entry;
                    if (!result.TryGetValue(package.Assembly, out entry))
                    {
                        entry         = result[package.Assembly] = new PackageItem <T>();
                        entry.Package = package;
                    }

                    entry.Items.Add(item);
                }
            }

            return(result);
        }
        private static IDictionary <string, PackageItemDetail> FindPackages()
        {
            var result   = new Dictionary <string, PackageItemDetail>();
            var packages = NuGetPackage.GetRegisteredPackages();

            foreach (var package in packages)
            {
                var name = package.GetAssemblyName();
                result[name] = new PackageItemDetail {
                    Name = package.GetId(), Version = package.GetVersion(), Assembly = name
                };
            }

            return(result);
        }