从List转换为IEnumerable格式

129
IEnumerable<Book> _Book_IE
List<Book> _Book_List

如何将_Book_List转换为IEnumerable格式?


7
他至少有一个惯例,是吧? - Femaref
2
对于那些想知道为什么Kirk的评论有如此多的“点赞”的人,这是因为你不能随心所欲地命名变量!有惯例需要遵循,强烈建议你遵循它们,这样你的代码就能清晰易懂,这将有助于像Stack-overflow或GitHub这样的地方试图帮助你的人们!有关更多信息,请阅读Robert C. Martin的书籍《Clean Code》。 - KADEM Mohammed
1
如何在不陷入Smurf命名反模式的情况下制定命名约定? https://devcards.io/smurf-naming-convention 通常,命名空间可以提供所需的特定性。 - Meadock
将转换为IEnumerable在需要在Linq表达式中使用.Reverse()时特别有用。 - Zuabros
6个回答

192

你不需要进行转换。 List<T> 实现了 IEnumerable<T> 接口,因此它已经是可枚举的。

这意味着下面的代码是完全没问题的:

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

以及:

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

可以被调用的函数:

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

2
如果你的函数返回一个Task<IEnumerable<Book>>,并且你尝试返回Task.FromResult(list_of_books),这是行不通的。我使用了AsEnumerable扩展方法来解决这个问题。 - Daniel

113

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

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

正如在这个MSDN链接中所说,这会在编译时更改列表的类型。这还将使您只枚举我们需要的集合(请参见MSDN示例)。


看起来很简单,但是它提供了最简便的转换方式。谢谢。 - Ishwor Khanal
1
如果您不打算向集合添加任何内容,则应使用/返回IEnumerable。 - AZ_
使用 System.Linq; - Dev-lop-er

18

为什么不使用一行代码解决问题呢?...

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

11
据我所知,List<T>实现了IEnumerable<T>。这意味着你不需要转换或强制转换任何东西。

8
视情况而定。如果您尝试将IEnumerable<IList<obj>>赋值给IEnumerable<IEnumerable<obj>>,会出现编译器错误,因为后者不继承自前者。 - Emaborsa

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

如果是通用版本:
_Book_IE = _Book_List;

如果您想转换为非泛型版本:

IEnumerable ie = (IEnumerable)_Book_List;

6
这里不需要用上演员阵容。 - Jon Skeet
2
如果您想要非泛型接口中的特定方法,因为其中一些是显式实现的,那么您需要这样做,否则我可能走错了方向? - Femaref

0

你需要

using System.Linq;

在你的List中使用IEnumerable选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接