Example #1
0
        static void Main(string[] args)
        {
            Init();// this method fills the arrays above with data


            // QUERIES!

            // - 1) how many Songs start with the letter 'a' (case insensitive)
            // - 2) how many artists end with letter 'a' (case insensitive)
            // - 3) whats the name of the song with longest duration
            // - 4) whats the total Duration of all Songs
            // - 5) how many albums have Songs longer than 300 seconds
            // - 6) print the names of the artists(separated with "--"), that have more than one album of PopRock genre
            // - 7) print the name of the album that has highest Average duration of a song
            // - 8) how many characters has the song that has the shortest Duration
            // - 9) print the name and the genre of the album that has most songs
            // - 10) print the name of the artist that has most songs
            // - 11) print the type of the artist(SoloArtist/Band) that has most albums published before year 2000
            // - 12) print the average song duration, of the album that has most songs

            // Bonus:
            // - print the longest song duration of the album that has least songs
            // - print the name of the album that has most songs that contain letter 'a' in the name
            // - print the name of the artist that has most songs that end with letter 'd'



            // ************ Don't mind the structure, focus on the lists declared on the beginning of Program.cs ****************

            // 3, 2, 1.... GO! :)
            #region 1)
            IEnumerable <Song> SongsThatStartWithLowercaseA = from song in Songs
                                                              where song.Name.ToLower().StartsWith('a')
                                                              select song;
            int NumberOfSongsThatStartWithLowercaseA = SongsThatStartWithLowercaseA.Count();
            Console.WriteLine($"1)  The number of songs that start with the letter 'a' is {NumberOfSongsThatStartWithLowercaseA}.");
            #endregion
            #region 2)
            IEnumerable <Artist> ArtistWithNameEndingInA = from artist in Artists
                                                           where artist.FullName.ToLower().EndsWith('a')
                                                           select artist;
            int NumberOfArtistsWithNameEndingInA = ArtistWithNameEndingInA.Count();
            Console.WriteLine($"2)  The number of artists whose name ends with the letter 'a' is {NumberOfArtistsWithNameEndingInA}.");
            #endregion
            #region 3)
            Song LongestDurationSong = Songs.Aggregate((song1, song2) => song1.Duration > song2.Duration ? song1 : song2);
            Console.WriteLine($"3)  The song with the longest duration is {LongestDurationSong.Name}.");
            #endregion
            #region 4)
            var TotalDurationOfAllSongs = Songs.Select(song => song.Duration)
                                          .Aggregate((dur1, dur2) => dur1 + dur2);
            Console.WriteLine($"4)  The total duration of all songs is {TotalDurationOfAllSongs} seconds.");
            #endregion
            #region 5)
            IEnumerable <Album> AlbumsWithSongsLongerThan5min = from album in Albums
                                                                where album.Songs.Where(song => song.Duration > 300).ToList().Any()
                                                                select album;
            int NumOfAlbumsWithSongsLongerThan5min = AlbumsWithSongsLongerThan5min.Count();
            Console.WriteLine($"5)  There are {NumOfAlbumsWithSongsLongerThan5min} albums that contain at least a single song that lasts longer than 5 minutes.");
            #endregion
            #region 6)
            IEnumerable <Artist> ArtistsWithAtLeast2PopRockAlbums = from artist in Artists
                                                                    where artist.Albums.Where(alb => alb.Genre == Genre.PopRock).Count() > 1
                                                                    select artist;
            Artist LastArtistWithAtLeast2PopRockAlbums = ArtistsWithAtLeast2PopRockAlbums.Last();
            Console.Write("6)  Artists with 2 or more PopRock Albums: ");
            foreach (Artist artist in ArtistsWithAtLeast2PopRockAlbums)
            {
                if (artist.Equals(LastArtistWithAtLeast2PopRockAlbums))
                {
                    Console.Write($"{artist.FullName}.");
                    Console.WriteLine("");
                }
                else
                {
                    Console.Write($"{artist.FullName}--");
                }
            }

            #endregion
            #region 7)
            var HighestAverageDurationAlbum = Albums.Aggregate((alb1, alb2) =>
                                                               alb1.Songs.Select(song => song.Duration)
                                                               .Aggregate(0, (dur1, dur2) => dur1 + dur2, sum => sum / alb1.Songs.Count()) >
                                                               alb2.Songs.Select(song => song.Duration)
                                                               .Aggregate(0, (dur1, dur2) => dur1 + dur2, sum => sum / alb2.Songs.Count())
                                                                ? alb1 : alb2);
            Console.WriteLine($"7)  The album with the highest average duration of a song is {HighestAverageDurationAlbum.Name}.");


            #endregion
            #region 8)
            Song ShortestDurationSong           = Songs.Aggregate((song1, song2) => song1.Duration < song2.Duration ? song1 : song2);
            int  ShortestDurationSongNameLength = ShortestDurationSong.Name.Length;
            Console.WriteLine($"8)  The song with the shortest duration has {ShortestDurationSongNameLength} characters in its name.");
            #endregion
            #region 9)
            Album AlbumWithMostSongs = Albums.Aggregate((alb1, alb2) => alb1.Songs.Count() > alb2.Songs.Count() ? alb1 : alb2);
            Console.WriteLine($"9)  The album with most songs is the {AlbumWithMostSongs.Genre} album: {AlbumWithMostSongs.Name}");
            #endregion
            #region 10)
            Artist ArtistWithMostSongs = Artists.Aggregate((art1, art2) => art1.Albums.SelectMany(alb => alb.Songs).Count() > art2.Albums.SelectMany(alb => alb.Songs).Count() ? art1 : art2);
            Console.WriteLine($"10) The artist with the most songs is {ArtistWithMostSongs.FullName}.");
            #endregion
            #region 11)
            Artist TypeOfArtistWithMostAlbumsBeforeYear2000 = Artists.Aggregate((art1, art2) =>
                                                                                art1.Albums.Where(alb => alb.Year < 2000).Count() > art2.Albums.Where(alb => alb.Year < 2000).Count()
                                                              ? art1 : art2);
            Console.WriteLine($"11) The artist with the most albums released before the year 2000 is of type {TypeOfArtistWithMostAlbumsBeforeYear2000.ArtistType}.");
            #endregion
            #region 12)
            int AvgSongDurationOfAlbumWithMostSongs = AlbumWithMostSongs.Songs
                                                      .Select(song => song.Duration)
                                                      .Aggregate(0, (dur1, dur2) => (dur1 + dur2), dursum => dursum / AlbumWithMostSongs.Songs.Count());
            Console.WriteLine($"12) The average length of a song in the album with the most songs lasts {AvgSongDurationOfAlbumWithMostSongs} seconds.");
            #endregion
            Console.WriteLine("\n --------------------------------BONUS--------------------------------\n ");
            #region Bonus 1)
            Album AlbumWithLeastSongs = Albums.Aggregate((alb1, alb2) => alb1.Songs
                                                         .Select(song => song.Duration).Aggregate((dur1, dur2) => dur1 + dur2) <
                                                         alb2.Songs
                                                         .Select(song => song.Duration).Aggregate((dur1, dur2) => dur1 + dur2)
                                                                       ? alb1 : alb2);
            Song LongestSongFromAlbumWithLeastSongs = AlbumWithLeastSongs.Songs.Aggregate((song1, song2) =>
                                                                                          song1.Duration > song2.Duration
                                                                          ? song1 : song2);
            Console.WriteLine($"1)  The longest song in the album with least songs lasts {LongestSongFromAlbumWithLeastSongs.Duration} seconds.");
            #endregion
            #region Bonus 2)
            Album AlbumWithMostAs = Albums.Aggregate((alb1, alb2) =>
                                                     alb1.Songs.Select(song => song.Name.ToLower().Contains('a')).Count() >
                                                     alb2.Songs.Select(song => song.Name.ToLower().Contains('a')).Count()
                                            ? alb1 : alb2);
            Console.WriteLine($"2)  The album which has the most songs that contain the letter 'a' in its name is {AlbumWithMostAs.Name}.");
            #endregion
            #region Bonus 3)
            Artist ArtistWithMostSongsThatEndInD = Artists.Aggregate((art1, art2) =>
                                                                     art1.Albums.SelectMany(alb => alb.Songs)
                                                                     .Select(song => song.Name)
                                                                     .Where(name => name.ToLower().EndsWith('d')).Count() >
                                                                     art2.Albums.SelectMany(alb => alb.Songs)
                                                                     .Select(song => song.Name)
                                                                     .Where(name => name.ToLower().EndsWith('d')).Count()
                                                           ? art1 : art2);
            Console.WriteLine($"3)  The artist that has the most songs that end in 'd' is {ArtistWithMostSongsThatEndInD.FullName}.");
            #endregion


            Console.ReadKey();
        }