2013-12-10 21 views
4

我發現一些線程具有類似的標題,但沒有一個似乎有一個合適的答案。 一個人提到.NET版本4.0以前的錯誤 - 我使用4.0,所以這不應該是它。StackOverflowException對嵌套查詢,小項數

考慮下面的例子: 我正在嘗試創建類Part的實例的集合,這些實例不屬於PartGroup的任何實例。

Func<Part,bool> hasGroup = P => partColl.Groups.Any(G => G.Parts.Contains(P)); 
var groupless = partColl.Parts.Where(P => ! hasGroup(P)); 

partColl是實現特性的基團和部分,每個IEnumerable<T>其中T是PartGroup或部分分別作爲List<T>內部實施的類的實例。 partColl.Parts包含存在的所有零件。 class Group擁有屬性IEnumerable<Part> Parts,列出對屬於該組的零件的引用。

在我目前的程序中,有27個零件和5個元素沒有重疊。 儘管有複雜的二次曲線,但如果沒有犯規,那應該不會有什麼問題。
當我運行這個時,它會崩潰hasGroup上的所述異常。

我錯過了什麼?


編輯: 一個小細節忘在抽象這裏介紹: IEnumerable的PartGroup.Parts是,不像PartCollection的兩個屬性,而不是一個列表的支持,這是一個自動財產與私人集,在傳入IEenumerable的c'tor中初始化。這個IEnumerable背後的實例也是一個列表,每個組都有一個列表,所以我不確定究竟發生了什麼。

BUT,異常是由消失:也支持該屬性與在構造類型爲List的和的變量,分配給它:_list = parts.ToList(),其中份是IEnumerable<Parts>,作爲PARAM傳遞到Ctor。我做了ToList只是爲了確保它確實是一個列表,而不是一半的查詢,但它應該,因爲在我正在構建組的地方,每個組的一個新列表在分配之前被分配......

剩下的問題仍然很有趣:發生了什麼事情,爲什麼自動屬性會導致「異常」? 我會根據要求發佈更多細節,但現在需要一段時間。

+0

什麼是導致異常的堆棧跟蹤?它可能會崩潰,因爲hasGroup使用堆棧,但在前面的部分出了問題。 –

+0

所有stacktrace顯示是調用三個不同的匿名方法,與[外部代碼]交織在一個模式中,如: __5(..)[External] __4(..)__6(..)[External] ... repeated ,並在最後說:「超過了Visual Studio支持的最大堆棧幀數。」 看起來對我來說是無盡的,我不明白爲什麼,儘管 – user1847129

+0

你是否覆蓋Equals或GetHashCode? – Johnbot

回答

0

這個小樣本不會重現問題。

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(); 
    } 
} 
+0

謝謝,我實際上是在寫這樣一個例子,看看我是否錯過了一個細節,然後找到一個...看到更新的第一篇文章 – user1847129