2016-12-05 14 views
7

Tôi có hai enums tương tự có cùng tên của các thành viên, nhưng chúng nằm trong các không gian tên khác nhau vì vậy chúng là "các kiểu khác nhau", nhưng trên thực tế namespace1.enum1 {a, b, c, d, e, f} và namespace2.enum2 {a, b, c, d, e, f}Fast IEnumerable <enum1> to List <enum2> convert

Cách dễ nhất để chuyển đổi IEnumerable<enum1> thành List<enum2> mà không sử dụng vòng lặp?

+2

Không có cách * an toàn * để thực hiện việc này mà không có vòng lặp, nhưng nếu bạn có thể sử dụng mã 'không an toàn', bạn có thể truyền trực tiếp bộ nhớ qua một dàn diễn viên. Điều này có thể dẫn đến bộ nhớ không hợp lệ, mặc dù các enums có bố cục bộ nhớ khác nhau. – Kroltan

Trả lời

14

Có gì đó sẽ lặp lại ở đâu đó nhưng không nhất thiết phải nằm trong mã của bạn. Chỉ cần một LINQ Select sẽ ổn thôi:

var result = original.Select(x => (Enum2) x).ToList(); 
+0

Dàn diễn viên sẽ vẫn hoạt động nếu được thực hiện như thế này '=> (Enum2) (int) x'? là nó không cần thiết? – Nkosi

+0

@Nkosi: Có, nhưng bạn không cần. –

+0

OK. cảm ơn – Nkosi

3

Hoặc bạn có thể sử dụng Cast (vẫn còn O (n) :-))

var result = original.Cast<int>().Cast<Enum2>().ToList(); 

Warning Có vẻ như rằng điều này sẽ không luôn luôn làm việc như dự kiến ​​(InvalidCastException có thể được ném trong một số trường hợp). Xem nhận xét để tìm hiểu lý do.

+0

Điều đó thực sự sẽ ném ngoại lệ trong một số trường hợp do tối ưu hóa không phù hợp mà 'Cast' tạo ra. Kỳ lạ, nhưng đúng. Có một bài đăng khác về nó ở đâu đó - sẽ cố gắng đào nó lên. –

+0

Xem http://stackoverflow.com/questions/40604183/ ('int' /' uint' giống như 'int'/enum.) –

+1

@JonSkeet Nếu kiểu cơ bản cho cả hai enums giống nhau thì nó vẫn sẽ là một vấn đề ở đây? Mặc dù nó có lẽ đáng để tránh điều này chỉ vì quyền anh. – juharr

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