我有一个名为usages
的实体列表,我从中创建了一个类似AdminUsage
类型的IEnumerable实体,如下所示:
var models = usages.Select(u => new AdminUsage(u));
当我在.ToList()
上调用models
时,我得到一个IndexOutOfRange异常,消息为"索引超出了数组的范围。"
为什么会发生这种情况,如何从原始列表AdminUsage
成功获取usages
类型的列表?
编辑:好的,实际上超出范围的索引在AdminUsage
构造函数中:
public AdminUsageModel(Usage usageDetails)
{
Title = usageDetails.UsageName[0]
}
所以我修改过的问题是为什么只在通话.ToList()
而不是原始.Select()
上抛出异常?
答案 0 :(得分:3)
为什么仅在调用.ToList()上抛出异常而不在原始.Select()上抛出异常?
因为Select()
没有做任何事情,所以这是一个承诺。使用ToList()
可以实现该承诺,这样就可以在实际执行代码时抛出异常。
另见MSDN: IEnumerable<T>.Select()
:
此方法使用延迟执行实现。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询。
另请参阅Deferred execution and eager evaluation,Trying to understand how linq/deferred execution works。