2009-07-24 2 views
6

수업의 converting a class to another list의 Q & A가 시원합니다. MyData 목록을 다른 MyData2 목록으로 변환하는 방법은 무엇입니까? 예를 들어 : Lambda 또는 LINQ를 사용하여 클래스 목록을 다른 클래스 목록으로 변환하거나 매핑 하시겠습니까?

List<MyData> list1 = new List<MyData>(); 
// somewhere list1 is populated 
List<MyData2> list2; 
// Now I need list2 from list1. How to use similar LINQ or Lambda to get 
list2 = ... ? 

는 여기이 시도하지만 전체 코드를 알아낼 수 없습니다 :

mydata2라는이 (문자열, 문자열, 문자열) 같은 ctor에있다
list2 = (from x in list1 where list1.PropertyList == null 
    select new MyData2(null, x.PropertyB, x.PropertyC). 
    Union (
     from y in list1 where list.PropertyList != null 
     select new MyData2(/* ? how to loop each item in ProperyList */ 
       y.PropertyB, y.PropertyC) 
    ).ToList(); 

.

답변

25

두 가지 유형이 다른 경우 동일한 선택을 사용하여 새 목록에 매핑합니다.

list2 = list1.Select(x => new MyData2() 
            { 
            //do your variable mapping here 
            PropertyB = x.PropertyB, 
            PropertyC = x.PropertyC 
            }).ToList(); 

편집을 추가하려면 :

을 이제 질문을 변경 있음. 당신은 당신이하려고하는 것을 고치는이 같은 것을 할 수 있습니다.

list2 = list1.Aggregate(new List<MyData2>(), 
       (x, y) => 
       { 
        if (y.PropertyList == null) 
        x.Add(new MyData2(null, y.PropertyB, y.PropertyC)); 
        else 
        x.AddRange(y.PropertyList.Select(z => new MyData2(z, y.PropertyB, y.PropertyC))); 

         return x; 
       } 
      ); 
+0

내 코드 부분을 업데이트했습니다. 이 경우 PropertyList에 대해 고려해야 할 것은 null인지 아닌지입니다. 거기에지도를 만드는 방법? –

+0

나는 이것을 좋아한다. 그건 그렇고, 부분 코드에서 유니온을 사용하려고 시도했는데 Rob Elliott을 사용하여 작동 시켰습니다. Aggregate와 Union의 차이점은 무엇입니까? –

3
list2 = list1.ConvertAll<MyData>(a => a.MyConversion()) 
+0

MyConversion()에 대한 세부 인라인 람다 식은 어떻습니까? –

+0

귀하의 요지를 봅니다. MyConversion()은 MyData2 클래스에 정의 된 메서드입니다. –

+0

실제로 ConvertAll이 작동하지 않습니다. list1.SelectMany (..) .ToList()를 사용하고 컴파일 오류가 없습니다. 그게 맞습니까? –