2012-07-27 47 views
10

Tôi có List<BaseClass> với các thành viên trong đó. Tôi muốn bỏ danh sách (và tất cả các thành viên của nó một cách cụ thể) thành loại List<ChildClass>, trong đó ChildClass kế thừa BaseClass. Tôi biết tôi có thể nhận được kết quả tương tự thông qua foreach:Nhập danh sách được phổ biến <BaseClass> vào Danh sách <ChildClass>

List<ChildClass> ChildClassList = new List<ChildClass>(); 
foreach(var item in BaseClassList) 
{ 
    ChildClassList.Add(item as ChildClass); 
} 

Nhưng có cách nào khác để thực hiện việc này không? Lưu ý - điều này được thực hiện trên nền tảng WP7.

Trả lời

18

Bạn có thể làm điều này nếu bạn đang thực sự chắc chắn tất cả các mục là bột nhôm:

ChildClassList = BaseClassList.Cast<ChildClass>().ToList(); 

mã hiện tại của bạn thêm null nếu một mục BaseClass không thể được đúc để ChildClass. Nếu đó thật sự ý định của bạn, điều này sẽ tương đương:

ChildClassList = BaseClassList.Select(x => x as ChildClass).ToList(); 

Nhưng tôi thà đề nghị này, trong đó bao gồm kiểm tra kiểu và sẽ bỏ qua các mục mà không phù hợp:

ChildClassList = BaseClassList.OfType<ChildClass>().ToList(); 
+0

Hãy thử cách của Botz ... –

+0

Cảm ơn - trong trường hợp này, tôi chắc chắn mọi thành phần đều thuộc loại được chỉ định. Tôi đã chia các mô hình của mình thành các phiên bản "câm" (chỉ có thuộc tính) và "thông minh" (tất cả các chức năng), nơi các lớp thông minh kế thừa câm. Ví dụ đầu tiên ở đây hoạt động giống như vậy - nhờ sự giúp đỡ! Điều đó cũng phù hợp với bạn @Adam Houldsworth –

3

Sau đây là gần tương đương với mã hiện tại của bạn (điều còn thiếu duy nhất là nó không thêm null cho phôi thất bại):

var childList = baseList.OfType<ChildClass>().ToList(); 

này sẽ igno các trường hợp lặp lại trong đó danh sách chứa một lớp dẫn xuất khác không phải là ChildClass.

Bạn cũng có thể sử dụng:

var childList = baseList.Cast<ChildClass>().ToList(); 

Nhưng điều này sẽ ném một InvalidCastException vào những thứ nó không thể đúc.

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