2011-02-03 44 views
5

Tôi muốn làm điều nàyC# Đúc Danh sách <ushort> vào danh sách <short>

List<ushort> uList = new List<ushort>() { 1, 2, 3 }; 
List<short> sList = uList.Cast<short>().ToList(); 

nhưng tôi nhận InvalidCastException "dàn diễn viên chỉ định không hợp lệ."

Làm cách nào để có thể truyền nhanh và hiệu quả bộ sưu tập trên?

Cảm ơn bạn.

+1

thể trùng lặp của [khó hiểu Enumerable.Cast InvalidCastException] (http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception) – Ani

+1

@Ani: Tôi sẽ không xem xét một bản sao vì tôi biết rằng bạn không thể truyền 'int' đến' long' (chúng có kích thước khác nhau), nhưng tôi mong đợi một diễn viên từ 'ushort' thành' short' có thể bởi vì chúng có cùng kích thước. Nói cách khác, '(ushort []) (đối tượng) ngắn mới [] {0, -1}' là hoàn toàn hợp lệ C#. – Gabe

+0

@Gabe: Đây là vấn đề tương tự. '(ngắn) ((ushort) 1)' là hợp lệ C# như là '(long) ((int) 1)' (dư thừa cast cho rõ ràng). Vấn đề là phải làm với trộn chuyển đổi số và unboxing. http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – Ani

Trả lời

7
List<short> sList = uList.Select(i => (short)i).ToList(); 
+0

Tôi thích giải pháp này, IMO, vì nó là LINQ tiêu chuẩn. –

+0

Tôi đã thực hiện nó theo cách này trước khi tôi kiểm tra lại ở đây, và nó hoạt động tốt. Tôi không chắc chắn nếu có sự khác biệt hiệu suất giữa điều này và sử dụng ConvertAll. –

9

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

List<short> sList = uList.ConvertAll(x => (short)x); 
Các vấn đề liên quan