索引超出了数组的范围,不可重现

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 List GameCategory,它在不同的地方被访问/修改/读取。你认为这可能是问题吗?如果是这样,您推荐什么解决方案?再次感谢您 不管有多少地方,取决于有多少不同的线程。如果是多线程的,需要ConcurrentBag @Charlieface 好的,我会调查的。谢谢 【参考方案1】:

在您使用 Where 后,包含 .First() 或 .FirstOrDefault() 作为 where 子句返回 null,因此它会落在下一部分。

【讨论】:

你甚至可以添加一个 if(filteredQuery!= null) do something 非常感谢您的回复。但是我需要所有元素,而不仅仅是 FirstOrDefault,而且我已经尝试将代码中的大部分元素设置为 null,但我从来没有让 Index 越界,只是 null 引用。【参考方案2】:

您应该在Where 之前添加x =&gt; x.Data.Category != null SelectMany.

【讨论】:

非常感谢您的回复。是的,我会这样做,但我认为即使没有空检查,它也应该给我一个空引用而不是索引超出范围。如果我错了,请纠正我。再次感谢您

以上是关于索引超出了数组的范围,不可重现的主要内容,如果未能解决你的问题,请参考以下文章

Parallel.Foreach 给出错误“索引超出了数组的范围”

Swift 致命错误:数组索引超出范围

错误:索引超出了数组的范围。 [复制]

索引超出了数组拆分函数的范围[重复]

Tableview使用空数组获取索引超出范围

索引超出了数组的范围[重复]