Linq语句在第二个方法调用实例化对象时崩溃(无异常)

本文关键字:崩溃 异常 对象 实例化 语句 第二个 方法 调用 Linq | 更新日期: 2023-09-27 18:02:47

我有一个实例化对象的方法,这个对象的一些属性是数组,我使用linq来获取数据。

private static GrowthYieldStructure CreateGrowthYieldStructure(int timberType, IEnumerable<Tree> trees)
    {
        var trees1 = trees;
        return new GrowthYieldStructure
                   {
                       TimberType = timberType,
                       CurrentDbhList = trees1.Select(x => x.DBH).ToArray(),
                       CurrentSpeciesList = trees1.Select(x => x.SpeciesNumber).ToArray(),
                       CurrentTpaList = trees1.Select(x => x.TPA).ToArray(),
                       CurrentTreeListLength = trees1.Count()
                   };
    }

我第一次调用这个方法,它工作得很好。第二次,它将在第二个select语句上失败,没有异常。

无论选择哪个值

例如,trees1.Select(x => x.DBH).ToArray()工作正常,trees1.Select(x => x.SpeciesNumber).ToArray()崩溃。

(我已经尝试切换抓取顺序/制作本地变量副本/我已经检查了值存在并且它们确实存在,没有什么不寻常的/使用try/catch(没有exp捕获))

编辑:我做了更多的局部变量来存储IEnumerable;仍未

如果我只有一个select语句,它会运行得很好…

——编辑2:(调用代码-可能会从内存中关闭)Stand,Plot, trees都是可枚举的(T是Stand,Plot,Tree)

foreach (var plot in plots.Where(x => x.StandID.Equals(stands.ID))) { 
  var plot1 = plot;
  var treeList = trees.Where(x => x.PlotID.Equals(plot1.ID)); 
  var growthYieldStructure = CreateGrowthYieldStructure(stands.TimberType, treeList); }

Edit3:最后看到了这个错误:类型为"System"的第一次机会异常。

然后终于意识到我的错误-

实际上是对象创建后使用的代码。我使用数组发送到外部库,因为数组是引用类型,这就解决了我怀疑的方式。但是由于我没有复制数组,而是创建了一个具有相同内存引用的新局部变量。

这会导致下一个对象init失败,因为它想在相同的内存loc中写入。

我只是改变了对象使用IEnumerable这样我可以有数组引用一次。很抱歉给您造成了混乱。

你知道为什么它会崩溃吗?

Linq语句在第二个方法调用实例化对象时崩溃(无异常)

这可能是由于IEnumerableIQueryable,并且它试图枚举不止一次。

试着换行:

var trees1 = trees;

var trees1 = trees.ToList();

将强制枚举,并且trees1将是List而不是可能的IQueryable