0

我有一个名为 的实体列表,usages我从中创建了一个 IEnumerable 类型的实体AdminUsage,如下所示:

var models = usages.Select(u => new AdminUsage(u));

当我调用.ToList()时,models我得到一个 IndexOutOfRange 异常,并显示消息“索引超出了数组的范围。”

为什么会发生这种情况,如何AdminUsage从原始列表中成功获取类型列表usages

编辑:好的,所以实际上超出范围的索引在AdminUsage构造函数内:

public AdminUsageModel(Usage usageDetails) { Title = usageDetails.UsageName[0] }

所以我修改后的问题是为什么异常只在调用.ToList()而不是在原来的时候抛出.Select()

4

1 回答 1

3

为什么仅在调用 .ToList() 而不是在原始 .Select() 上引发异常?

因为 aSelect()什么都不做,所以它是一个承诺。随着ToList()您实现该承诺,这就是代码实际执行并引发异常的时间。

另请参阅MSDN:IEnumerable<T>.Select() :

该方法是通过使用延迟执行来实现的。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 Visual C# 中的 foreach 或 Visual Basic 中的 For Each 枚举对象之前,不会执行此方法表示的查询。

另请参阅延迟执行和急切评估尝试了解 linq/延迟执行的工作原理

于 2015-02-25T16:04:55.077 回答