Я нашел несколько потоков с похожими заголовками, но ни один из них не имеет подходящего ответа. Один упоминал ошибку в версиях .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 только для того, чтобы убедиться, что это будет список, а не какой-то наполовину испеченный запрос, но он должен, так как в том месте, где я создаю группы, перед тем, как передать его, выделяется один новый список для каждой группы ...
Остающийся вопрос по-прежнему интересен: что происходило, почему авто-свойство «вызывало» исключение? Я отправлю дополнительную информацию по запросу, но сейчас нужно побывать.
Какова трассировка стека, ведущая к исключению? Это может привести к сбою, потому что hasGroup использует стек, но что-то пошло не так раньше в куске. –
Все шоу stacktrace - это вызовы трех различных анонимных методов, переплетенных с [Внешним кодом] в шаблоне, таком как: __5 (..) [Внешний] __4 (..) __6 (..) [Внешний] ... повторный , и в конце он говорит: «Превышено максимальное количество фреймов стека, поддерживаемых Visual Studio». Выглядит бесконечно-петлю ко мне, я не понимаю почему, хотя – user1847129
Вы переписываете Equals или GetHashCode? – Johnbot