2009-02-08 2 views
19

IEnumerable의 순서 목록을 취하고 첫 번째 요소 다음에 두 번째 요소 등을 순서대로 생성하는 간단한 IEnumerable을 반환하는 간단한 기본 제공 방법이 있습니까?C#에서 IEnumerables 체인?

필자는 필자 자신 만의 글을 쓸 수는 있었지만 필자는 먼저이 유용한 작업을 수행하기위한 방법이 이미 있었는지 알고 싶었습니다.

답변

24

SelectMany를 사용해보십시오.

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){ 
return e.SelectMany(x => x); 
} 

이 함수의 목적은 T를 IEnumerable < >으로는 IEnumerable <를 IEnumerable <T> > 그룹을 평탄화하는 것이다. 반환 된 데이터는 원래의 순서를 보존합니다. - JaredPar의 (올바른) 대답 또한

15

또한 구문 쿼리 다음 (올바른) LINQ 기반의 답변에 추가

var all = from inner in outer 
      from item in inner 
      select item; 
12

...

당신이 LINQ를 사용하지 않으려면,

public class ChainedEnumerable<T> : IEnumerable<T> 
{ 
    private readonly IEnumerable<T>[] _inners; 

    public ChainedEnumerable(params IEnumerable<T>[] inners) 
    { 
     _inners = inners; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (IEnumerable<T> inner in _inners) 
     { 
      foreach (T t in inner) 
      { 
       yield return t; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

이처럼 사용 :

당신은 수율을 사용하여 ChainedEnumerable 클래스를 발명 할 수210
+0

+1 이것은 멋지고 깔끔한 해결책입니다. 나는 그것을 내 물건 속에 넣을 것이라고 믿는다! –