2009-07-24 45 views
6

Các câu hỏi và trả lời của converting a class to another list của lớp học là mát mẻ. Làm thế nào để chuyển đổi danh sách MyData sang danh sách MyData2 khác? Ví dụ:Chuyển đổi hoặc ánh xạ danh sách lớp thành danh sách lớp khác bằng cách sử dụng Lambda hoặc 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 = ... ? 

Ở đây tôi thử này, nhưng tôi không thể tìm ra các mã hoàn chỉnh:

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(); 

nơi MyData2 có một ctor tương tự (string, string, string).

Trả lời

25

Nếu hai loại khác nhau, bạn sẽ sử dụng cùng một Chọn để ánh xạ tới danh sách mới.

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

Chỉnh sửa để thêm:

Bây giờ bạn đã thay đổi câu hỏi của bạn. Bạn có thể làm một cái gì đó như thế này để sửa chữa những gì bạn đang cố gắng làm.

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

tôi cập nhật mã số của tôi, một phần một. Trường hợp này, tôi phải xem xét PropertyList là null hay không. Làm cách nào để lập bản đồ ở đó? –

+0

Tôi thích điều này. Nhân tiện, trong mã số từng phần của tôi, tôi đã cố gắng sử dụng Union và tôi đã nhận được nó bằng cách sử dụng Rob Elliott. Sự khác biệt giữa Tổng hợp và Liên minh là gì? –

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

chi tiết biểu thức Lambda nội tuyến chi tiết cho MyConversion() như thế nào? –

+0

Tôi thấy quan điểm của bạn. MyConversion() là một phương thức được định nghĩa trong lớp MyData2. –

+0

thực sự, ConvertAll không hoạt động. Tôi sử dụng list1.SelectMany (..). ToList() và không biên dịch lỗi. Có đúng không? –

Các vấn đề liên quan