【发布时间】:2021-04-07 20:49:30
【问题描述】:
我有一个IEnumerable<object>。我想检查IEnumerable<object> 里面是否有任何值。
我的方法是这样的:
private static JObject TransformExcelDatasource(Stream originalDatasource)
{
// Read Excel Data
var excelReader = new ExcelReader(originalDatasource);
var sheetReader = excelReader[0];
//Check if row has any values
var row = sheetReader.Row(100);
var rowHasValues = row.Any();
if (rowHasValues)
{
//do stuff
}
}
我尝试获取只有 3 行的 Excel 表的第 100 行。我知道,这只是一个 POC。
var rowHasValues = row.Any(); 行抛出 System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
这就是变量IEnumerable<object>row 的样子:
我尝试了这些问题的答案(first、second),但对我没有任何帮助。
我如何检查IEnumerable<object> row 是否有任何值而不得到IndexOutOfRangeException?
更新
这是抛出的 IndexOutOfRangeException
row.Current 也不是一个选项,因为它 IEnumerable<object> 不包含它。
完整的堆栈跟踪:
at LightWeightExcelReader.SheetReader.get_Item(String cellAddress)
at LightWeightExcelReader.SheetReader.<get_Item>b__8_1(String x)
at System.Linq.Utilities.<>c__DisplayClass2_0`3.<CombineSelectors>b__0(TSource x)
at System.Linq.Enumerable.SelectListIterator`2.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at NR.DataAdapter.Core.Services.TransformDatasourceService.TransformExcelDatasource(Stream originalDatasource) in C:\Dev\src\ipa-dataadapter\NR.DataAdapter.Core\Services\TransformDatasourceService.cs:line 35
at NR.DataAdapter.Core.Services.TransformDatasourceService.TransformDatasource(IDatasource interpretedDatasource) in C:\Dev\src\ipa-dataadapter\NR.DataAdapter.Core\Services\TransformDatasourceService.cs:line 19
at NR.DataAdapter.Core.DataAdapter.AdaptDatasources() in C:\Dev\src\ipa-dataadapter\NR.DataAdapter.Core\DataAdapter.cs:line 24
at NR.DataAdapter.UI.Controllers.HomeController.Dashboard() in C:\Dev\src\ipa-dataadapter\NR.DataAdapter.UI\Controllers\HomeController.cs:line 24
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
【问题讨论】:
-
值得注意的是(从您的图片中)该行是一个 SelectListIterator。我真的很惊讶
row.Any()抛出。但是(也来自你的图片),你可以试试row.Current != null -
再看你的照片。你确定
row.Any()在扔吗?如果不展开调试助手中的Results View,会不会出现异常? -
@Flydog57 我会用你的问题的答案更新问题
-
@Nightscape 请edit您的问题包括异常的完整堆栈跟踪。
-
您也可以尝试将
row的声明从IEnumerable<object>更改为var。通过强制变量的类型(到接口而不是实际类型),您最终可能会调用Any的错误实现
标签: c# ienumerable indexoutofrangeexception