2017-02-20 3 views
1

새로운 익명 형식 (컬렉션)을 만드는 약간의 C# 코드가 있습니다. 컬렉션의 항목은 Child.Value에 의해서만 다릅니다. 내가 달성하려고하는 것은 : 모든 부모의 각 자식에 대해 가장 높은 값을 갖는 부모 - 자식 쌍을 가져 와서 자식 복제본없이 부모 - 자식 쌍 수를 줄입니다. 아이는 이드에 의해 구별됩니다. 각 부모에 대한 단일 부모 - 자식 쌍을해야하는 경우익명 형식 컬렉션 필터링

var familyPairs = family 
     .SelectMany(parent => parent.Children, (parent, child) => 
       new { 
        Parent = parent, 
        Child = child 
        }) 
     .OrderByDescending(pair => pair.Child.Value); 

답변

2

, 당신은 간단한 선택을 사용할 수 있습니다

family.Select(p => new { 
    Parent = p, 
    Child = p.Children.OrderByDescending(c => c.Value).FirstOrDefault() 
}) 

또는 당신은 자녀가없는 부모를위한 쌍을 원하지 않는 경우 - 무료 아이를 필터링 부모 : 당신의 갱신 후

family.Where(p => p.Children.Any()).Select(p => new { 
    Parent = p, 
    Child = p.Children.OrderByDescending(c => c.Value).First() 
}) 

당신이 SelectMany이 필요하다고 밝혀,하지만 당신은 ID로 그룹 아이들에게 필요 및 최대 값을 각 그룹 아이에서 선택

family.SelectMany(
    p => p.Children.GroupBy(c => c.Id) 
        .Select(g => g.OrderByDescending(c => c.Value).First()), 
    (p,c) => new { Parent = p, Child = c }) 
+0

나는 그것을 밖으로 시도 할 것이다. :) –

+0

죄송합니다. 편집에 대한 의견이있는 경우 제 질문을 편집했습니다. 그러나 나는 여전히 이것을 시도 할 것입니다. –

+0

@ CeylanMumunKocabaş 귀하의 편집에서 명확하지 않습니다 - 당신이 부모의 자녀 목록에 같은 아이에 대한 여러 항목이 있다면, 어떻게 두 아이를 구별합니까? –

2

만 최대 아이를 원하는 경우는, 정렬 시간 낭비입니다 (n은 아이의리스트에 대한 N 작업 로그). 대신 Aggregate() 확장 메서드를 사용하여 각 자식 목록을 한 번 반복하여 자식을 최대 값으로 가져와야합니다.

family.Select(p => new { 
Parent = p, 
Child = p.Children.Aggregate((c1, c2) => c1.Value > c2.Value ? c1 : c2)}) 

참조 : How can I get LINQ to return the object which has the max value for a given property?

+0

또한 여러 자녀가 ​​최대 값을 공유하면> 연산자와> 연산자 사이에 큰 차이가 있음을 지적해야합니다. > 연산자는 최대 값을 가진 마지막 자식을 선택하고> =는 첫 번째 값을 선택합니다. – plushpuffin