从List转换为IEnumerable格式

Wha*_*sUP 87 c# asp.net-mvc ienumerable c#-4.0

IEnumerable<Book> _Book_IE
List<Book> _Book_List
Run Code Online (Sandbox Code Playgroud)

我怎么做才能转换_Book_ListIEnumerable格式?

Dar*_*rov 136

你不需要转换它.List<T>实现IEnumerable<T>接口,因此它已经是一个可枚举的.

这意味着完全可以拥有以下内容:

public IEnumerable<Book> GetBooks()
{
    List<Book> books = FetchEmFromSomewhere();    
    return books;
}
Run Code Online (Sandbox Code Playgroud)

以及:

public void ProcessBooks(IEnumerable<Book> books)
{
    // do something with those books
}
Run Code Online (Sandbox Code Playgroud)

可以调用:

List<Book> books = FetchEmFromSomewhere();    
ProcessBooks(books);
Run Code Online (Sandbox Code Playgroud)

  • 如果您的函数返回 Task&lt;IEnumerable&lt;Book&gt;&gt; 并且您尝试返回 Task.FromResult(list_of_books) 这将不起作用。我使用 AsEnumerable 扩展方法来解决这个问题。 (2认同)

cdi*_*die 56

您可以在Assembly System.Core和System.Linq命名空间中使用扩展方法AsEnumerable:

List<Book> list = new List<Book>();
return list.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)

这将在此MSDN链接上说明在编译时更改List的类型.这将为您提供仅枚举我们所需的集合的好处(请参阅MSDN示例).


Rah*_*ury 13

为什么不使用单衬......

IEnumerable<Book> _Book_IE= _Book_List as IEnumerable<Book>;
Run Code Online (Sandbox Code Playgroud)


Ela*_*fer 11

据我所知,List<T>实施IEnumerable<T>.这意味着您不必转换或投射任何东西.

  • 这取决于.如果您尝试将"IEnumerable <IList <obj >>"设置为"IEnumerable <IEnumerable <obj >>",则会产生编译器错误,因为第二个不会从第一个继承. (3认同)

Fem*_*ref 5

IEnumerable<Book> _Book_IE;
List<Book> _Book_List;
Run Code Online (Sandbox Code Playgroud)

如果是通用变体:

_Book_IE = _Book_List;
Run Code Online (Sandbox Code Playgroud)

如果要转换为非泛型:

IEnumerable ie = (IEnumerable)_Book_List;
Run Code Online (Sandbox Code Playgroud)

  • 你不需要这里的演员。 (5认同)
  • 如果您想要来自非通用接口的特定方法,因为其中一些是明确实现的,或者我在这里走错了路,您会这样做吗? (2认同)