230

이 질문에는 이미 답변이 있습니다.

public class ConsolidatedChild
{
    public string School { get; set; }
    public string Friend { get; set; }
    public string FavoriteColor { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public string School { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Friend { get; set; }
    public string Mother { get; set; }
    public string FavoriteColor { get; set; }
}

위의 두 클래스가 주어지면 LINQ를 사용하여 목록에서 목록을 만들고 학교, 친구 및 FavoriteColor 속성으로 그룹화했습니다. LINQ를 사용하여이 작업을 수행 할 수 있습니까?

속성을 무시하십시오. 코드는 질문에 도움이되도록 작성되었습니다.


2 답변


360

쉬운:

var consolidatedChildren =
    from c in children
    group c by new
    {
        c.School,
        c.Friend,
        c.FavoriteColor,
    } into gcs
    select new ConsolidatedChild()
    {
        School = gcs.Key.School,
        Friend = gcs.Key.Friend,
        FavoriteColor = gcs.Key.FavoriteColor,
        Children = gcs.ToList(),
    };


  • 그룹에 많은 속성이 있다고 가정 해 봅시다. 모든 속성을 나열한 더 깨끗한 방법이 있습니까? - guiomie
  • @guiomie - 깨끗한 방법이 있다고 말하지 않을 것입니다. 객체를 하나의 문자열로 직렬화하고 그룹화 할 수는 있지만 다른 곳에서는 더 많은 코드가 필요합니다. 그래서, 내 마음 속에,이 대답은 얼마나 많은 속성에 관계없이 가장 깨끗한 방법입니다. - Enigmativity
  • @ 도핑가 - 두 가지 이유로 편집을 취소했습니다. 마지막 쉼표 사용의 선택 (이후FavoriteColor)는 의도적으로 - 합법적 인 구문이며 코드를 쉽게 리팩토링 할 수 있습니다. 사용의 선택gcs오히려gc그룹화 변수에 대해서도 역시 목적이있다. 이것은 그것이 "많은 그룹의 그룹"이라는 것을 나에게 보여준다. - Enigmativity
  • 나는 컴파일하지 않을 것이라고 생각했지만 절대적으로 옳습니다. 변수의 이름을 변경하는 것은 6 자 제한을 초과하는 것입니다. 누군가의 변수 이름을 엉망으로 만들고 싶지 않습니다. 어쨌든 멋진 답변에 다시 한 번 감사드립니다! - Doppelganger

184

주어진 목록 :

var list = new List<Child>()
                {
                    new Child()
                        {School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "John"},
                    new Child()
                        {School = "School2", FavoriteColor = "blue", Friend = "Bob", Name = "Pete"},
                    new Child()
                        {School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "Fred"},
                    new Child()
                        {School = "School2", FavoriteColor = "blue", Friend = "Fred", Name = "Bob"},
                };

쿼리는 다음과 같습니다.

var newList = list.GroupBy(x => new {x.School, x.Friend, x.FavoriteColor})
                    .Select(y => new ConsolidatedChild()
                                        {
                                            FavoriteColor = y.Key.FavoriteColor,
                                            Friend = y.Key.Friend,
                                            School = y.Key.School,
                                            Children = y.ToList()
                                        }
                    );

테스트 코드 :

foreach(var item in newList)
{
    Console.WriteLine("School: {0} FavouriteColor: {1} Friend: {2}", item.School,item.FavoriteColor,item.Friend);
    foreach(var child in item.Children)
    {
        Console.WriteLine("\t Name: {0}", child.Name);
    }
}

결과:

School: School1 FavouriteColor: blue Friend: Bob
         Name: John
         Name: Fred
School: School2 FavouriteColor: blue Friend: Bob
         Name: Pete
School: School2 FavouriteColor: blue Friend: Fred
         Name: Bob


  • 유창한 인터페이스를 선호하는 우리에게 좋습니다. 작은 변수 : 동일한 변수 "x"를 사용함. 두 가지 Func 정의 모두 최신 사용자에게는 명확하지 않습니다. 위와 일치하도록 변경하는 것이 좋습니다. 여기서 " c " 자식이고, "gcs" 그룹화 된 어린이들입니다. - Michael Blackburn
  • @ jazmatician _ 재사용한다는 점에 관해 나는 동의한다.x변수 이름에 대한 선택이 아니라 일부를 혼동시킬 수 있습니다. 그것을 (으)로 변경하겠습니다.xy그것은 그것을 차별화했다. - Jamiec
  • 변수 이름도 선택할 수 없습니다. 사실, 필자는 "gcs"가 무엇인지 알아 내려고 애썼다. 저자를 의미합니다. 내가 생각할 수있는 최선의 방법은 " 그룹 (of) Cs "입니다. 어쨌든, 나는 누군가가 두 구문 사이에서 정신 맵을 만드는 것을 쉽게하도록 노력했다. (신택스? 신택스는 그 복수형 인 단어 중 하나입니다. 영어이므로, "구문"은 복수형에 대한 통사론의 규칙에 따라야하는 이유는 무엇입니까?) - Michael Blackburn
  • 내 자신의 탄젠트에 대답하는 것 :en.wiktionary.org/wiki/syntax - Michael Blackburn
  • 나는이 의견에 동의하지 않는다. 제 견해로, x는 두 위치 모두에서 사용해야합니다. Func을 사용하여 다른 Hunc를 사용하는 경우가 아니라면 y로 가야합니다. 그렇지 않으면 혼란 스럽습니다. - Serj Sagan

연결된 질문


관련된 질문

최근 질문