Chuyển đổi từ danh sách sang định dạng IEnumerable


97
IEnumerable<Book> _Book_IE
List<Book> _Book_List

Tôi phải làm thế nào để chuyển đổi _Book_Listsang IEnumerableđịnh dạng?


58
Quy ước đặt tên của bạn là duy nhất một cách đáng tiếc.
Kirk Woll

6
Ít nhất thì anh ấy cũng có một hội nghị, hả?
Femaref

1
Đối với những người thắc mắc tại sao bình luận của Kirk lại có nhiều "thăng" như vậy, đó là bởi vì bạn không thể chỉ đặt tên biến của mình theo cách bạn muốn! có những quy ước cho điều đó và bạn nên tuân theo chúng để mã của bạn có thể rõ ràng và dễ hiểu, điều này sẽ giúp những người đang cố gắng trợ giúp bạn ở những nơi như Stack-tràn hoặc GitHub! để biết thêm thông tin, hãy đọc cuốn sách: Clean Code của Robert C. Martin.
KADEM Mohammed

1
... và làm thế nào để đi đến một quy ước đặt tên mà không trở thành con mồi của kiểu chống đặt tên Xì trum? devcards.io/smurf-naming-convention Thông thường, một không gian tên có thể cung cấp tính cụ thể khi cần thiết.
Meadock

Câu trả lời:


150

Bạn không cần phải chuyển đổi nó. List<T>triển khai IEnumerable<T>giao diện để nó đã là một kiểu liệt kê.

Điều này có nghĩa là hoàn toàn ổn nếu có những điều sau:

public IEnumerable<Book> GetBooks()
{
    List<Book> books = FetchEmFromSomewhere();    
    return books;
}

cũng như:

public void ProcessBooks(IEnumerable<Book> books)
{
    // do something with those books
}

có thể được gọi:

List<Book> books = FetchEmFromSomewhere();    
ProcessBooks(books);

63

Bạn có thể sử dụng phương thức mở rộng AsEnumerable trong không gian tên Assembly System.Core và System.Linq:

List<Book> list = new List<Book>();
return list.AsEnumerable();

Điều này, như đã nói trên liên kết MSDN này sẽ thay đổi loại Danh sách trong thời gian biên dịch. Điều này cũng sẽ mang lại cho bạn những lợi ích khi chỉ liệt kê bộ sưu tập của bạn mà chúng tôi cần (xem ví dụ MSDN về điều này).


Trông đơn giản nhưng là cách dễ dàng nhất để chuyển đổi. Cảm ơn bạn
Ishwor Khanal

1
Nếu bạn không muốn thêm thứ gì đó vào Bộ sưu tập thì bạn nên sử dụng / trả về IEnumerable.
AZ_

15

Tại sao không sử dụng một lớp lót đơn ...

IEnumerable<Book> _Book_IE= _Book_List as IEnumerable<Book>;

11

Theo như tôi biết các List<T>dụng cụ IEnumerable<T>. Nó có nghĩa là bạn không phải chuyển đổi hoặc ép kiểu gì cả.


4
Nó phụ thuộc. Nếu bạn cố gắng đặt a IEnumerable<IList<obj>>thành một IEnumerable<IEnumerable<obj>>nó sẽ gây ra lỗi trình biên dịch vì cái thứ hai không kế thừa từ cái đầu tiên.
Emaborsa

4
IEnumerable<Book> _Book_IE;
List<Book> _Book_List;

Nếu đó là biến thể chung:

_Book_IE = _Book_List;

Nếu bạn muốn chuyển đổi thành không chung chung:

IEnumerable ie = (IEnumerable)_Book_List;

5
Bạn không cần diễn viên ở đây.
Jon Skeet

2
Bạn thực hiện nếu bạn muốn các phương pháp cụ thể từ giao diện không chung chung, vì một số trong số chúng được triển khai rõ ràng, hay tôi đang đi sai hướng ở đây?
Femaref

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.