我想知道是否可以将 anIEnumerable
转换为List
. 除了将每个项目复制到列表中之外,还有其他方法吗?
6 回答
如前所述,使用yourEnumerable.ToList()
. 它枚举你的IEnumerable
,将内容存储在一个新的List
. 您不一定要复制现有列表,因为您IEnumerable
可能会懒惰地生成元素。
这正是其他答案所暗示的,但更清楚。这是反汇编,因此您可以确定:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
return new List<TSource>(source);
}
using System.Linq;
使用 .ToList() 方法。在 System.Linq 命名空间中找到。
var yourList = yourEnumerable.ToList();
https://docs.microsoft.com/en-us/dotnet/api/system.linq?view=netcore-2.2
正如其他人所建议的,只需ToList()
在可枚举对象上使用该方法:
var myList = myEnumerable.ToList()
但是,如果您实现IEnumerable
接口的对象没有该ToList()
方法并且您收到如下错误:
“IEnumerable”不包含“ToList”的定义
...您可能缺少System.Linq
namespace,因为该方法是该命名空间提供的扩展方法,它不是接口本身的成员。 ToList()
IEnumerable
因此,只需将命名空间添加到您的源文件中:
using System.Linq
创建一个新的 List 并将旧的 IEnumerable 传递给它的初始化器:
IEnumerable<int> enumerable = GetIEnumerable<T>();
List<int> list = new List<int>(enumerable);
不,你应该复制,如果你确定引用是对列表的引用,你可以像这样转换
List<int> intsList = enumIntList as List<int>;
另一个陷阱(异步调用)
异步调用可能是您的问题。如果您添加了 using System.Linq 语句并且您仍然收到错误“不包含 'ToList' 的定义并且没有可访问的扩展方法...”,请仔细查看错误消息中的 Task 关键字。
原始电话(作品)
IEnumerable<MyDocument> docList = await _documentRepository.GetListAsync();
尝试使用 ToList(仍然无法正常工作)
所以......如果你这样做并且它不起作用
List<MyDocument> docList = await _documentRepository.GetListAsync().ToList();
使用括号
您实际上是在 Task<IEnumerable> 上调用 ToList!像这样在您的等待调用周围添加括号
List<MyDocument> docList = (await _documentRepository.GetListAsync()).ToList();