IndexOutOfRange调用.ToList()时的异常

时间:2015-02-25 15:43:46

标签: c# linq indexoutofrangeexception

我有一个名为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()上抛出异常?

1 个答案:

答案 0 :(得分:3)

  

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

因为Select()没有做任何事情,所以这是一个承诺。使用ToList()可以实现该承诺,这样就可以在实际执行代码时抛出异常。

另见MSDN: IEnumerable<T>.Select()

  

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

另请参阅Deferred execution and eager evaluationTrying to understand how linq/deferred execution works