LINQ GroupBy 메서드를 사용하는 방법은 무엇입니까?

몇 주 전에 원래 이 게시물을 my blog에 게시했습니다. LINQ에 대한 포스트 시리즈의 일부입니다.

one of the most common LINQ methods을 자세히 살펴보겠습니다. GroupBy를 사용하여 컬렉션의 요소를 그룹화하는 방법을 알아보겠습니다.

GroupBy 메서드는 그룹화 키를 기반으로 컬렉션의 요소를 그룹화합니다. 이 메서드는 해당 키로 구성된 "그룹"또는 "버킷"모음을 반환합니다.

요소를 그룹화할 때 키로 사용할 속성이 있는 GroupBy 메서드receives as a parameter a delegate.

예를 들어 등급별로 영화 카탈로그를 그룹화해 보겠습니다.

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 rating
var groupedByRating = movies.GroupBy(movie => movie.Rating);
//                           ^^^^^^^

foreach (var group in groupedByRating)
{
    // Each group or bucket has a Key property  
    Console.WriteLine($"Rating: {group.Key}");

    foreach (var movie in group)
    {
        Console.WriteLine($"{movie.Name}");
    }
    Console.WriteLine();
}

// Output:
//Rating: 4.5
//Titanic
//
//Rating: 4.6
//The Fifth Element
//
//Rating: 4.7
//Terminator 2
//
//Rating: 5
//Avatar
//My Neighbor Totoro
//
//Rating: 4
//Platoon

record Movie(string Name, int ReleaseYear, float Rating);


최상위 수준 문, 레코드 및 암시적 using 문을 사용했습니다. 모든 상용구 코드가 사라졌습니다! 또한 영화 카탈로그를 그룹화하기 위해 movie => movie.Rating 메서드의 매개변수로 GroupBy를 사용했습니다.


books.GroupBy(book => book.Category)...Cristina GottardiUnsplash 사진

모든 그룹을 변화시키는 방법은 무엇입니까?



키별로 컬렉션을 그룹화하는 것 외에도 GroupBy 메서드에는 항목의 각 그룹 또는 버킷을 변환하는 또 다른 오버로드가 있습니다.

동일한 등급의 영화를 계산하도록 이전 예를 변경해 보겠습니다.

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 type
var countByRating = movies.GroupBy(movie => movie.Rating,
                    (rating, movies) => new RatingCount(rating, movies.Count());
//                  ^^^^^^^^^^^^^^^^

foreach (var group in countByRating)
{
    Console.WriteLine($"{group.Rating}: [{group.Count}]");
}

// 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);


이번에는 GroupBy 메서드에 두 번째 매개변수를 전달했습니다. 첫 번째 매개변수는 평소와 같이 여전히 그룹화 키였습니다. 그러나 두 번째는 그룹화 키와 각 그룹의 요소를 받은 대리자였습니다. 우리는 두 매개변수의 이름을 ratingmovies 로 지정했습니다.

등급과 등급별 영화를 사용하여 모든 영화 그룹을 새로운 개체RatingCount로 변환했습니다. 등급이 같은 영화를 세고 싶었기 때문에 다른 LINQ 방법인 Count를 사용했습니다.

둘 이상의 속성으로 그룹화하는 방법은 무엇입니까?



앞의 두 예에서는 Rating 속성을 그룹화 키로 사용했습니다. 그러나 하나 이상의 그룹화 속성으로 컬렉션의 요소를 그룹화할 수 있습니다.

GroupBy 메서드를 사용하여 둘 이상의 속성으로 컬렉션을 그룹화하려면 사용자 지정 개체를 그룹화 키로 사용합니다.

예를 들어 개봉 연도와 시청률을 기준으로 영화 카탈로그를 그룹화하려면 다음과 같은 LINQ 쿼리를 작성할 수 있습니다.

var groupByReleasedYearAndRating = movies.GroupBy(movie => new { movie.ReleaseYear, movie.Rating });


그러면 Key 속성은 기본 값이 아니라 객체가 됩니다. 즉, 각 그룹의 ReleaseYearRating 모두에 액세스할 수 있습니다.

예를 들어,

var groupByReleasedYearAndRating = movies.GroupBy(movie => new { movie.ReleaseYear, movie.Rating });

foreach (var group in groupByReleasedYearAndRating)
{
    var groupingKey = group.Key;
    //                vvvvvvvvvvv
    var releaseYear = groupingKey.ReleaseYear;
    var rating = groupingKey.Rating;
    //           ^^^^^^^^^^^

    // Do something with the releaseYear and rating...

    foreach (var movie in group)
    {
        // Do something with each movie in the group
    }
}


짜잔! 그것이 GroupBy 방법입니다. 컬렉션의 요소로 그룹 또는 버킷을 만들고 각 그룹을 변환합니다. 이전 예제의 출력을 확인했다면 GroupBy 메서드는 요소를 정렬하지 않고 그룹화했습니다. 이를 위해서는 OrderBy 메서드가 필요합니다.

LINQ 및 기타 방법에 대해 알아보려면 내 블로그에서 my quick guide to LINQ을 확인하십시오. 15분 이내에 LINQ 작업을 시작하기 위해 알아야 할 모든 것.

여기요! 저는 소프트웨어 엔지니어이자 평생 학습자인 Cesar입니다. 내 작업을 지원하려면 교육에 대한 내 Getting Started with LINQ 과정을 확인하십시오. 여기에서 이러한 방법과 기타 LINQ 방법을 자세히 다룹니다.

즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기