LINQ GroupBy 메서드를 사용하는 방법은 무엇입니까?
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 Gottardi의 Unsplash 사진
모든 그룹을 변화시키는 방법은 무엇입니까?
키별로 컬렉션을 그룹화하는 것 외에도
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
메서드에 두 번째 매개변수를 전달했습니다. 첫 번째 매개변수는 평소와 같이 여전히 그룹화 키였습니다. 그러나 두 번째는 그룹화 키와 각 그룹의 요소를 받은 대리자였습니다. 우리는 두 매개변수의 이름을 rating
및 movies
로 지정했습니다.등급과 등급별 영화를 사용하여 모든 영화 그룹을 새로운 개체
RatingCount
로 변환했습니다. 등급이 같은 영화를 세고 싶었기 때문에 다른 LINQ 방법인 Count
를 사용했습니다.둘 이상의 속성으로 그룹화하는 방법은 무엇입니까?
앞의 두 예에서는
Rating
속성을 그룹화 키로 사용했습니다. 그러나 하나 이상의 그룹화 속성으로 컬렉션의 요소를 그룹화할 수 있습니다.GroupBy 메서드를 사용하여 둘 이상의 속성으로 컬렉션을 그룹화하려면 사용자 지정 개체를 그룹화 키로 사용합니다.
예를 들어 개봉 연도와 시청률을 기준으로 영화 카탈로그를 그룹화하려면 다음과 같은 LINQ 쿼리를 작성할 수 있습니다.
var groupByReleasedYearAndRating = movies.GroupBy(movie => new { movie.ReleaseYear, movie.Rating });
그러면
Key
속성은 기본 값이 아니라 객체가 됩니다. 즉, 각 그룹의 ReleaseYear
와 Rating
모두에 액세스할 수 있습니다.예를 들어,
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 방법을 자세히 다룹니다.
즐거운 코딩하세요!
Reference
이 문제에 관하여(LINQ GroupBy 메서드를 사용하는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/canro91/how-to-use-linq-groupby-method-37k6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)