索引超出了数组的范围,不可重现
Posted
技术标签:
【中文标题】索引超出了数组的范围,不可重现【英文标题】:Index was outside the bounds of the array not reproducible 【发布时间】:2021-06-05 14:07:57 【问题描述】:我在实时产品上收到此错误,我看到它出现在列表 SelectMany 的最后一行,但我根本无法重现它。我尝试过不同的场景,但徒劳无功。 知道为什么会发生异常吗?
堆栈跟踪:
在 System.Collections.Generic.List'1.Enumerator.MoveNext() 在 System.Linq.Enumerable.d_17'2.MoveNext() 在 System.Linq.Enumerable.d_64'1.MoveNext() 在 System.Collections.Generic.List'1..ctor(IEnumerable'1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable'1 源)
我的代码:
public List<int> GetCategories(SelectQuery query, List<Product> products)
var filteredQuery = query.FilterItems.Where(f => f.Type != Type.Category);
var filteredproducts = products
.Where(x => x.Data != null &&
x.Data.Category.Any() && filteredQuery.ApplyFilter(x)).ToList();
return filteredproducts.SelectMany(x => x.Data.Category).Distinct().ToList();
【问题讨论】:
如果你不能那么你希望我们怎么做?考虑到跟踪顶部涉及List
代码,猜测可能是对列表的多线程访问
向我们展示异常消息或内部异常消息
@Charlieface 非常感谢您的回复。我也这么相信。 SelectMany Data.Category 中的 Category 是一个 public ListConcurrentBag
@Charlieface 好的,我会调查的。谢谢
【参考方案1】:
在您使用 Where 后,包含 .First() 或 .FirstOrDefault() 作为 where 子句返回 null,因此它会落在下一部分。
【讨论】:
你甚至可以添加一个 if(filteredQuery!= null) do something 非常感谢您的回复。但是我需要所有元素,而不仅仅是 FirstOrDefault,而且我已经尝试将代码中的大部分元素设置为 null,但我从来没有让 Index 越界,只是 null 引用。【参考方案2】:您应该在Where
之前添加x => x.Data.Category != null
SelectMany.
【讨论】:
非常感谢您的回复。是的,我会这样做,但我认为即使没有空检查,它也应该给我一个空引用而不是索引超出范围。如果我错了,请纠正我。再次感谢您以上是关于索引超出了数组的范围,不可重现的主要内容,如果未能解决你的问题,请参考以下文章