2016-08-22 6 views
0

입력 및 출력없이 설명하기가 어렵습니다. 내 프로젝트의 불필요한 세부 사항을 피하기 위해 간단한 Car 예제를 만들었습니다.SelectMany의 반대편은 무엇입니까?

List<car> cars = new List<car>() 
{ 
    new car() { carname = "bmw", carwheels = new List<int>() { 1, 2, 3, 4 } }, 
    new car() { carname = "cadillac", carwheels = new List<int>() { 1, 2, 3, 4 } }, 
    new car() { carname = "mustang", carwheels = new List<int>() { 1, 2, 3, 4 } } 
}; 

내가 출력이에게 원하는 확장 클래스와 :

{ 
    { carname = "bmw", carwheel = 1 }, 
    { carname = "bmw", carwheel = 2 }, 
    { carname = "bmw", carwheel = 3 }, 
    { carname = "bmw", carwheel = 4 }, 
    { carname = "cadillac", carwheel = 1 }, 
    { carname = "cadillac", carwheel = 2 }, 
    { carname = "cadillac", carwheel = 3 }, 
    { carname = "cadillac", carwheel = 4 }, 
    { carname = "mustang", carwheel = 1 }, 
    { carname = "mustang", carwheel = 2 }, 
    { carname = "mustang", carwheel = 3 }, 
    { carname = "mustang", carwheel = 4 } 
} 

IEnumerable을 확장 방법으로 볼록이 할 수있는 방법이 있나요

나는이 목록을 가지고? 뭔가 SelectMany()의 반대처럼 행동.

+11

정확히 왜 'SelectMany'는 정확히 반대가 아닙니까? –

+0

@TimSchmelter - 내 이해에 따라, SelectMany()는 아래쪽 목록을 가져와 각각을 자동차 바퀴 목록이있는 싱글로 전개합니다. SelectMany()에 또 다른 과부하가 있습니까? – BeemerGuy

+0

이것은 'SelectMany'의 반대가 아니며 * SelectMany입니다. – dasblinkenlight

답변

6

이고, SelectMany()은 정확히 SelectMany()입니다. 당신은 그런이를 얻을 수 있습니다 (사용자가 지정한 속성과 익명 형식의 내 코드에서) 새로운 객체에 대한 각 차량의

var result = cars.SelectMany(c => 
      c.carwheels.Select(w => new 
      { 
       carname = c.carname, 
       carwheel = w 
      })).ToList(); 

내부 Select 프로젝트 바퀴를. 그리고 바깥 쪽 SelectMany()은이 시퀀스들을 하나의리스트로 평평하게 만듭니다.

+0

네, 잠시 동안 머리를 돌리고 있습니다. 오해의 소지가 생겨서 죄송합니다. 이것은 내가 필요한 것입니다! – BeemerGuy

-2

아마도이 솔루션이 도움이 될 것입니까? 이 IEnumerable을 고정 크기는 IEnumerable로는 IEnumerable을 분할합니다

public static class EnumerableExtension 
{ 
    private static IEnumerable<T> GetChunk<T>(IEnumerator<T> source, int size) 
    { 
     yield return source.Current; 

     for (int i = 1; i < size; i++) 
     { 
      if (source.MoveNext()) 
      { 
       yield return source.Current; 
      } 
      else 
      { 
       yield break; 
      } 
     } 
    } 

    public static IEnumerable<IEnumerable<T>> SplitToChunks<T>(this IEnumerable<T> source, int size) 
    { 
     if (size < 1) 
     { 
      throw new ArgumentOutOfRangeException(); 
     } 

     using (var enumerator = source.GetEnumerator()) 
     { 
      while (enumerator.MoveNext()) 
      { 
       yield return GetChunk(enumerator, size); 
      } 
     } 
    } 

} 

죄송합니다, 제대로 질문) 나는 자세한의 LINQ 구문이 더 읽기 찾을 드문 경우 중 하나

2

읽지 않은 :

var query = from car in cars 
      from carwheel in car.carwheels 
      select new { car.carname, carwheel };