Cara Menggunakan Metode LINQ GroupBy
Mari kita lihat lebih dalam salah satu metode LINQ yang paling umum: GroupBy.
Metode GroupBy mengelompokkan elemen-elemen dari sebuah koleksi berdasarkan kunci pengelompokan. Metode ini mengembalikan kumpulan "grup" atau "bucket" yang diorganisir berdasarkan kunci tersebut.
Metode GroupBy menerima sebagai parameter sebuah delegasi dengan properti yang akan digunakan sebagai kunci saat mengelompokkan elemen.
Contohnya, mari kita kelompokkan katalog film berdasarkan rating.
var movies = new List<Movie>{ new Movie("Titanic", 1998, 4.5f), new Movie("The Fifth Element", 1997, 4.6f), new Movie("Terminator 2", 1991, 4.7f), new Movie("Avatar", 2009, 5), new Movie("Platoon", 1986, 4), new Movie("My Neighbor Totoro", 1988, 5)};// Group our catalog of movies based on their ratingvar groupedByRating = moviesy(movie => movie);foreach (var group in groupedByRating){ // Each group or bucket has a Key property Consoleine($"Rating: {group}"); foreach (var movie in group) { Consoleine($"{movie}"); } Consoleine();}// Output://Rating: 4.5//Titanic////Rating: 4.6//The Fifth Element////Rating: 4.7//Terminator 2////Rating: 5//Avatar//My Neighbor Totoro////Rating: 4//Platoonrecord Movie(string Name, int ReleaseYear, float Rating);Kita menggunakan pernyataan top-level, record, dan using implisit. Semua kode boilerplate hilang!
Juga, untuk mengelompokkan katalog film, kita menggunakan movie => movie sebagai parameter untuk metode GroupBy.
Cara mengubah setiap grup
Selain mengelompokkan koleksi berdasarkan kunci, metode GroupBy memiliki overload lain untuk mengubah setiap grup atau bucket item.
Mari kita ubah contoh sebelumnya untuk menghitung jumlah film dengan rating yang sama.
var movies = new List<Movie>{ new Movie("Titanic", 1998, 4.5f), new Movie("The Fifth Element", 1997, 4.6f), new Movie("Terminator 2", 1991, 4.7f), new Movie("Avatar", 2009, 5), new Movie("Platoon", 1986, 4), new Movie("My Neighbor Totoro", 1988, 5)};// Transform every group into a RatingCount typevar countByRating = moviesy(movie => movie, (rating, movies) => new RatingCount(rating, movies()));foreach (var group in countByRating){ Consoleine($"{group}: [{group}]");}// Output://4.5: [1]//4.6: [1]//4.7: [1]//5: [2]//4: [1]record Movie(string Name, int ReleaseYear, float Rating);record RatingCount(float Rating, int Count);Kali ini, kita memberikan parameter kedua ke metode GroupBy.
Parameter pertama tetap kunci pengelompokan seperti biasa. Namun, parameter kedua adalah delegasi yang menerima kunci pengelompokan dan elemen dari setiap grup. Kita menamai kedua parameter: rating dan movies.
Dengan rating dan film per rating, kita mengubah setiap grup film menjadi objek baru, RatingCount.
Karena kita ingin menghitung film dengan rating yang sama, kita menggunakan metode LINQ lain: Count.
Cara mengelompokkan berdasarkan lebih dari satu properti
Kita telah menggunakan Rating sebagai kunci pengelompokan. Namun kita dapat mengelompokkan elemen koleksi berdasarkan lebih dari satu properti pengelompokan.
Dengan metode GroupBy, untuk mengelompokkan koleksi berdasarkan lebih dari satu properti, gunakan objek kustom sebagai kunci pengelompokan.
Misalnya, untuk mengelompokkan katalog film berdasarkan tahun rilis dan rating, kita dapat menulis query LINQ seperti ini:
var groupByReleasedYearAndRating = moviesy(movie => new{ movieeYear, movie});Kemudian, properti Key akan menjadi sebuah objek, bukan nilai primitif. Artinya, kita dapat mengakses baik ReleaseYear maupun Rating dari setiap grup.
Contohnya:
var groupByReleasedYearAndRating = moviesy(movie => new { movieeYear, movie });foreach (var group in groupByReleasedYearAndRating){ var groupingKey = group; var releaseYear = groupingKeyeYear; var rating = groupingKey; // Do something with the releaseYear and rating... foreach (var movie in group) { // Do something with each movie in the group... }}Nah, itulah metode GroupBy. Ia membuat grup atau bucket dengan elemen-elemen dari sebuah koleksi dan mengubah setiap grup.
Jika Anda perhatikan output dari contoh sebelumnya, metode GroupBy mengelompokkan elemen tanpa mengurutkannya. Untuk itu, kita membutuhkan metode OrderBy.
Selamat berkoding!