2013-12-10 2 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> где Т PartGroup или части, соответственно, внутренне реализована в виде List<T>. partColl.Parts содержит все части в наличии. класс Group имеет имущество IEnumerable<Part> Parts, перечисляя ссылки на части, принадлежащие группе.

В моей текущей программе есть 27 частей и 5 групп без перекрытия элементов. Ничего, что могло бы помешать стеку, несмотря на квадратичную сложность, если что-то не было фолом.
Когда я запустил это, он будет сбой с указанным исключением в hasGroup.

Что мне не хватает?


EDIT: Немного деталь поскользнулся моя абстракция представлена ​​здесь: IEnumerable PartGroup.Parts был, в отличие от двух свойств PartCollection, не подкреплена список, это авто-недвижимость с частным набором , инициализированный в c'tor с переданным IEenumerable. Экземпляр за этим IEnumerable также является списком и собственным для каждой группы, поэтому я не уверен, что происходит точно.

НО, исключение прошло: также поддерживает эту собственность с переменным типом List и в конструкторе, назначая ему: _list = parts.ToList(), где части является IEnumerable<Parts>, передаются как пары к ctor. Я сделал ToList только для того, чтобы убедиться, что это будет список, а не какой-то наполовину испеченный запрос, но он должен, так как в том месте, где я создаю группы, перед тем, как передать его, выделяется один новый список для каждой группы ...

Остающийся вопрос по-прежнему интересен: что происходило, почему авто-свойство «вызывало» исключение? Я отправлю дополнительную информацию по запросу, но сейчас нужно побывать.

+0

Какова трассировка стека, ведущая к исключению? Это может привести к сбою, потому что hasGroup использует стек, но что-то пошло не так раньше в куске. –

+0

Все шоу stacktrace - это вызовы трех различных анонимных методов, переплетенных с [Внешним кодом] в шаблоне, таком как: __5 (..) [Внешний] __4 (..) __6 (..) [Внешний] ... повторный , и в конце он говорит: «Превышено максимальное количество фреймов стека, поддерживаемых 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

Смежные вопросы