2013-03-08 3 views
3

숙제 정보 : 캐스터 (마녀 (0)/동화 (1))와 철자 (int)가 있습니다. 나는 그들을리스트에 저장했다.FindAll 조건이 다른 관련성이 있음

나는 두 가지 유형의 장점을 찾아야합니다. (동일한 주문 력을 가진 여러 캐스터가있을 수 있습니다.) 이 코드를 작성했지만 문제가 있습니다. 가장 많은 주문량을 가진 시전자가 1 인 경우 첫 번째 FindAll은 유형 0의 시전자와 가장 많은 주문량을 가진 시전자를 찾으므로 아무 것도 반환하지 않습니다. 가장 많은 주문량을 가진 시전자가 유형 1 인 경우 가장 많은 주문량을 가진 유형 0의 시전자를 포함한 목록을 어떻게 얻을 수 있습니까?

답변

3

LINQ GroupBy 행동 :-) 분할 할 수 있습니다 희망 만 수 할 필요가 정확히 무엇을 말하지 않았기 때문에 :

var strongest_casters = casters.GroupBy(c => c.TypeOfCaster) 
           .Select(grp => grp.OrderByDescending(x => x.SpellPower) 
               .First() 
            ); 

또는 이상을 반환 각 유형 중 하나 :

var strongest_casters = casters.GroupBy(c => c.TypeOfCaster) 
           .SelectMany(grp => grp.Where(y.SpellPower == grp.Max(x => x.SpellPower)) 
             ); 
+0

우아한 접근 – NDJ

+0

@NDJ : 감사합니다. LINQ를 사용하려고 선택할 때 나는 LINQ로 모든 것을 시도합니다. 비록 코드가 명시 적 루프로 더 읽기 쉽다는 것을 알지만 (그리고 나는 LINQ를 전혀 사용하지 않을 것입니다). –

+0

처음에는 거의 C#처럼 보였지만 GroupBy에 대한 기사를 읽은 후, 내가하는 일을 이해하고 있으며 솔루션은 훌륭합니다. 난 정말 좋아. –

2
private List<Caster> BestCasters() 
{ 
    var witches = casters.Where(x => x.TypeOfCaster == 0).ToList(); 
    var fairies = casters.Where(x => x.TypeOfCaster == 1).ToList(); 

    int witchesMax = witches.Max(x => x.SpellPower); 
    int fairiesMax = fairies.Max(x => x.SpellPower); 

    var temp = witches.Where(x => x.SpellPower == witchesMax).ToList(); 
    temp.AddRange(fairies.Where(x => x.SpellPower == fairiesMax)); 

    return temp.OrderBy(x => x.TypeOfCaster).ThenBy(y => y.CasterName).ToList(); 
} 
+0

고맙습니다. 지금은 분명합니다. Where 메서드가 있는지 몰랐습니다. –

+0

BTW, ToList는 처음 두 줄에서는 전혀 쓸모가 없습니다. –

+0

@BenVoigt 그렇지 않습니다. 이 ToList()가 없으면 전체 캐스터리스트가 네 번 반복됩니다. – MarcinJuraszek

0

당신은 오른쪽 종류의 바퀴를 포함하는 부분 집합에 최대를 호출해야합니다 같은 findall은 사용해야하는 경우

private List<Caster> BestCasters() 
    { 
     List<Caster> temp = new List<Caster>(); 
     temp = casters.FindAll(x => x.SpellPower == casters.Max(y => y.SpellPower) && (x.TypeOfCaster == 0)); 
     temp.AddRange(casters.FindAll(x => x.SpellPower == casters.Max(y => y.SpellPower) && (x.TypeOfCaster == 1))); 
     temp.OrderBy(x => x.TypeOfCaster).ThenBy(y => y.CasterName); 
     return temp; 
    } 
. 물론 초기 목록을 분리 한 다음 각 종류의 가장 강한 캐스터를 가져 오는 것이 더 합리적입니다. 당신은 당신이 이것에 대한 완벽한 당신이