2008-10-15 2 views
3

죄송합니다. 제목이 아플뿐입니다. 당신은 하나의 문으로 그것을 축소 할 수 있습니다 경우개체 컬렉션의 컬렉션 속성을 조합하는 방법은 있습니까?

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents){ 

    var result = new List<Child>(); 

    foreach(Parent parent in parents) 
    foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

, 미친 어려움에 그것을 시도 :

한 줄에 다음 코드 세그먼트를 축소 Linq를 컬렉션에 확장 방법이 있는지 궁금 하군요
public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas){ 

    var result = new List<Child>(); 

    foreach(Grandparent papa in nanas) 
    foreach(Parent parent in papa.Children) 
     foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

답변

7

를 의무적 방법 양식입니다.

return parents 
    .SelectMany(p => p.Children); 

그리고 두 가지 수준에 대한

:

return oldies 
    .SelectMany(grand => grand.Children) 
    .SelectMany(parent => parent.Children); 
+0

나는 이것을 대답으로 선택하지 않은 이유를 모르겠다 ... – Will

9

이 작동합니다 :

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents) 
{ 
    return from parent in parents 
      from child in parent.Children 
      select child; 
} 

다음이 :

참고 :이 예제에서는 실제로 목록을 반환하지 않습니다. IEnumerable 데이터 소스를 반환합니다. foreach를 시작할 때까지 또는 이와 유사한 방식으로 실제로 처리하지 않습니다.

당신이 목록을 반환해야하는 경우 다음과 같이 각 리턴 문을 수정 : 여기

return (from ..... 
      ... 
      select child).ToList(); 
+0

반환 값은 IEnumerable을 수 있고, 할 수있는 (적어도 내가 아는 한) 가장 쉬운 방법 즉, IEnumerable을 구현하는 컬렉션을 반환이다 . 답변 해주셔서 감사합니다! – Will

+0

익숙하지 않은 경우 컬렉션을 반환하거나 yield return을 사용하여 msdn에서 yield 키워드를 조회 할 수 있습니다. –

+0

수익률에 좋은 점 ... 일반적으로 실패하는 길에 따른 단계로 인해 이러한 유형의 사례에서는 그렇게하지 않습니다.이 경우 빈 컬렉션 만 반환합니다. 그것의 꽤 명백한 것, 수확량이 때때로 나 뒤에 오는 사람들을 위해이 경우에 어떻게되는지 분명하지 않은 반면에 ... – Will