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

时间:2011-07-18 19:54:18

标签: c# linq

我有一个实例化对象的方法,该对象的一些属性是我使用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()

                   };
    }

我第一次调用此方法时效果很好。 第二次失败,第二个选择语句没有异常。

- 无论它试图选择哪个值

例如,trees1.Select(x => x.DBH).ToArray()有效,trees1.Select(x => x.SpeciesNumber).ToArray()崩溃。

(我已经尝试切换获取顺序/制作局部变量副本/我已经检查过这些值是否存在且没有任何异常/使用try / catch(没有exp捕获))

编辑: 我制作了更多的局部变量来存储IEnumerable;仍然失败

如果我只有一个select语句,它将运行良好......

- Edit2 :(调用代码 - 可能会从内存中移除) 看台,情节,树都是IEnumerable(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.AccessViolationException”类型的第一次机会异常。

然后终于实现了我的错误 -

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

这导致下一个对象init失败,因为它想要在同一个内存中写入..

我只是改变了对象以使用IEnumerable这种方式我可以拥有一次数组引用。 对不起,感到困惑。

有什么想法为什么会崩溃?

1 个答案:

答案 0 :(得分:3)

可能会IEnumerable作为IQueryable并且它会尝试不止一次枚举。

尝试更改行:

var trees1 = trees;

var trees1 = trees.ToList();

会强制枚举,而trees1将是List,而不是IQueryable