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这样我可以有数组引用一次。很抱歉给您造成了混乱。
你知道为什么它会崩溃吗?
这可能是由于IEnumerable
是IQueryable
,并且它试图枚举不止一次。
试着换行:
var trees1 = trees;
var trees1 = trees.ToList();
将强制枚举,并且trees1
将是List
而不是可能的IQueryable