public static void AddItemToGroup <T>(RealObservableCollection <GroupInfoList <T> > group, T addition, Func <T, char> keyConversion)
        {
            GroupInfoList <T> list = GetItemGroup(group, addition, keyConversion);

            if (list.FirstOrDefault((a) => ((dynamic)a).ID == ((dynamic)addition).ID) == null)
            {
                list.Add(addition);
            }
        }
        public static GroupInfoList <T> GetItemGroup <T>(RealObservableCollection <GroupInfoList <T> > group, string key)
        {
            GroupInfoList <T> list = group.FirstOrDefault((g) => g.Key.ToString() == key);

            if (list == null)
            {
                key  = "\uD83C\uDF10";
                list = group.First((g) => g.Key.ToString() == key);
            }
            return(list);
        }
        public static GroupInfoList <T> GetItemGroup <T>(RealObservableCollection <GroupInfoList <T> > group, T addition, Func <T, char> keyConversion)
        {
            string key = (keyConversion(addition).ToString().ToLower());

            if (Char.IsDigit(key[0]) || Char.IsSymbol(key[0]))
            {
                key = "#";
            }
            else if (!Char.IsLetter(key[0]))
            {
                key = "\uD83C\uDF10";
            }

            return(GetItemGroup <T>(group, key));
        }
        public DeletionResult DeleteSong(Song song, RealObservableCollection <GroupInfoList <Artist> > artistsList,
                                         RealObservableCollection <GroupInfoList <Album> > albumsList,
                                         RealObservableCollection <GroupInfoList <Song> > songsList)
        {
            GroupInfoList <Song> songList = MusicLibrary.GetItemGroup(songsList, song, a => a.SongTitle[0]);

            List <Song> songs;

            if (Songs.TryGetValue(song.Artist.ToLower() + "--" + song.Album.ToLower(), out songs))
            {
                songList.Remove(song);
                songs.Remove(song);
            }
            songs = GetSongs(song.Artist, song.Album);
            if (songs.Count == 0)
            {
                Songs.Remove(song.Artist.ToLower() + "--" + song.Album.ToLower());
                List <Album> albums;
                if (Albums.TryGetValue(song.Artist.ToLower(), out albums))
                {
                    Album album = albums.FirstOrDefault((a) => a.AlbumName == song.Album);
                    albums.Remove(album);
                    if (albums.Count == 0)
                    {
                        GroupInfoList <Album> albumList = MusicLibrary.GetItemGroup(albumsList, album, aa => aa.AlbumName[0]);
                        Albums.Remove(song.Artist.ToLower());
                        albumList.Remove(album);

                        Artist artist = Artists[song.Artist.ToLower()];

                        GroupInfoList <Artist> artistList = MusicLibrary.GetItemGroup(artistsList, artist, a => a.ArtistName[0]);
                        Artists.Remove(song.Artist.ToLower());
                        artistList.Remove(artist);
                        return(DeletionResult.Artist);
                    }
                    return(DeletionResult.Album);
                }
            }
            return(DeletionResult.Song);
        }
        private MusicLibrary()
        {
            ArtistGroupDictionary = CreateObservableGroupDictionary <Artist>();
            ArtistsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = ArtistGroupDictionary
            };

            AlbumGroupDictionary = CreateObservableGroupDictionary <Album>();
            AlbumsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = AlbumGroupDictionary
            };

            SongGroupDictionary = CreateObservableGroupDictionary <Song>();
            SongsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = SongGroupDictionary
            };

            _cache = new MusicLibraryCache();
        }