C# 嵌套查询上的StackOverflowException,小项计数

C# 嵌套查询上的StackOverflowException,小项计数,c#,.net,linq,stack-overflow,C#,.net,Linq,Stack Overflow,我发现了一些标题类似的帖子,但似乎没有一个合适的答案。 有人提到了4.0之前的.NET版本中的一个bug——我使用4.0,所以不应该是这样 举个例子: 我正在尝试创建类Part的实例集合,这些实例不属于类PartGroup的任何实例 Func<Part,bool> hasGroup = P => partColl.Groups.Any( G => G.Parts.Contains(P) ); var groupless = partColl.Parts.Where( P

我发现了一些标题类似的帖子,但似乎没有一个合适的答案。 有人提到了4.0之前的.NET版本中的一个bug——我使用4.0,所以不应该是这样

举个例子: 我正在尝试创建类Part的实例集合,这些实例不属于类PartGroup的任何实例

Func<Part,bool> hasGroup = P => partColl.Groups.Any( G => G.Parts.Contains(P) );
var groupless = partColl.Parts.Where( P => ! hasGroup(P) );
Func hasGroup=P=>partColl.Groups.Any(G=>G.Parts.Contains(P));
var groupless=partColl.Parts.Where(P=>!hasGroup(P));
partColl是实现属性组和部分的类的实例,每个属性组和部分
IEnumerable
,其中T分别是PartGroup或Part,在内部实现为
List
。 partColl.Parts包含所有存在的部件。 类组具有属性
IEnumerable Parts
,列出了对属于该组的部分的引用

在我目前的程序中,有27个部分和5个组,元素没有重叠。 如果没有什么不好的东西,那么即使是二次复杂度,也不会给堆栈带来麻烦。
当我运行此程序时,它将在hasGroup上崩溃,并出现所述异常

我错过了什么


编辑: 我在这里介绍了我的抽象概念的一个小细节: IEnumerable PartGroup.Parts与PartCollection的两个属性不同,没有列表支持,它是一个具有私有集的自动属性,在c'tor中使用传入的IEenumerable初始化。这个IEnumerable背后的实例也是一个列表,每个组都有一个自己的列表,所以我还不确定到底发生了什么

但是,异常消失了::也用List类型的变量支持该属性,并在构造函数中为其赋值:_List=parts.ToList(),其中parts是
IEnumerable
,作为参数传递给ctor。我这样做只是为了确保它真的是一个列表,而不是一个半生不熟的查询,但它应该是这样的,因为在我构建组的地方,在传递它之前,会为每个组分配一个新列表

剩下的问题仍然很有趣:发生了什么,为什么自动属性“导致”异常?
我将根据要求发布更多详细信息,但现在必须先发布一段时间。

此小样本不会重现此问题

using System;
using System.Linq;
using System.Collections.Generic;
class P
{
    class PartGroup
    {
        public List<Part> Parts { get; private set; }
        public PartGroup()
        {
            Parts = new List<Part>();
        }
    }

    class Part
    {
    }

    class PartCollection
    {
        public List<Part> Parts { get; set; }
        public List<PartGroup> Groups { get; set; }
        public PartCollection()
        {
            Parts = new List<Part>();
            Groups = new List<PartGroup>();
        }
    }

    static void Main()
    {
        var groups = new List<PartGroup> { new PartGroup(), new PartGroup(), new PartGroup(), new PartGroup(), new PartGroup() };
        var partColl = new PartCollection();
        partColl.Parts.Add(new Part());
        partColl.Groups.AddRange(groups);
        for (int i = 0; i < 27; i++)
        {
            var part = new Part();
            groups[i % groups.Count].Parts.Add(part);
            partColl.Parts.Add(part);
        }
        partColl.Parts.Add(new Part());

        Func<Part, bool> hasGroup = P => partColl.Groups.Any(G => G.Parts.Contains(P));
        var groupless = partColl.Parts.Where(P => !hasGroup(P)).ToList();
    }
}
使用系统;
使用System.Linq;
使用System.Collections.Generic;
P类
{
类零件组
{
公共列表部分{get;private set;}
公共部分组()
{
零件=新列表();
}
}
班级部分
{
}
类零件集合
{
公共列表部分{get;set;}
公共列表组{get;set;}
公共部分收藏()
{
零件=新列表();
组=新列表();
}
}
静态void Main()
{
var groups=new List{new PartGroup()、new PartGroup()、new PartGroup()、new PartGroup()、new PartGroup()};
var partColl=new PartCollection();
添加(新零件());
partColl.Groups.AddRange(组);
对于(int i=0;i<27;i++)
{
var part=新零件();
组[i%groups.Count].Parts.Add(part);
零件库零件添加(零件);
}
添加(新零件());
Func hasGroup=P=>partColl.Groups.Any(G=>G.Parts.Contains(P));
var groupless=partColl.Parts.Where(P=>!hasGroup(P)).ToList();
}
}

导致异常的堆栈跟踪是什么?它可能会崩溃,因为hasGroup使用了stack,但在文章的前面出现了一些问题。stacktrace显示的只是对三个不同的匿名方法的调用,它们与[External Code]以类似的模式交织在一起:uu 5(…)[External]u 4(…)u 6(…)[External External]重复,最后它说:“已超过Visual Studio支持的最大堆栈帧数。”我觉得这似乎有点荒谬,我不明白为什么,尽管你是在覆盖Equals还是GetHashCode?不,但请参阅更新的主帖子我已经编辑了你的标题。请参阅“”,其中的共识是“不,不应该”“.谢谢,我实际上是在写一个这样的例子,看看我是否遗漏了一个细节,然后找到了一个。。。见更新后的第一篇文章