【问题标题】:Cast list to list: index out of range error将列表转换为列表:索引超出范围错误
【发布时间】:2014-01-16 19:13:09
【问题描述】:

我已经声明了以下结构:

List<List<Service.Field>> out = new List<List<Service.Field>>();
List<List<Service.Field>> tempOut = new List<List<Service.Field>>();
tempOut.Add(method.ReturnFields);
out.AddRange(tempOut);

当我这样做时:

 out = out.OrderByDescending(a => (DateTime)a[1].Value).ToList();

我收到一个错误:

进程中的异常 (processName) 异常类型: System.ArgumentOutOfRangeException,异常消息:索引超出 范围。必须是非负数且小于集合的大小。 参数名称:索引,

在此操作之前,我检查并退出。OrderByDescending(a => (DateTime)a[1].Value) 不为空。

知道为什么投射会返回此消息吗?

【问题讨论】:

  • 可能在您的out 集合中的子列表中没有任何项目,它适用于第一个项目,但对另一个项目失败?
  • 您必须检查 a 是否有 2 项或更多 a 不为 null 并不意味着拥有更多项,a[1] 您检查第二项
  • 这是一个不起作用的示例小提琴 - dotnetfiddle.net/sg15ff 因为第三个项目中没有任何子时间。
  • @SergeyLitvinov 谢谢!你说的对!现在我知道问题出在哪里了。谢谢!

标签: c# .net list casting


【解决方案1】:

只有当您调用ToList 时,您的订单查询才会被执行。在调用之前,这只是一个IQueryable 对象。而且由于显然不是out 中的所有列表都有两个元素,因此您在ToList 调用后会遇到异常。要处理此问题,您需要检查元素 a[1] 是否存在。例如:

out1 = out1.OrderByDescending(a => (a.Count >= 1) ? (DateTime)a[1].Value : DateTime.MinValue).ToList();

旁注。 out 在 C# 中是保留的,你确定你的代码可以编译吗?

【讨论】:

  • 是的,它已编译。我在文本编辑器中更改了名称,因为这是我的商业代码,我无法显示真实数据:) 感谢您的快速响应!
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多