2015-07-21 2 views
0

Если бы у меня был объект под названием Thing, который имел имущество Id и Children, где Children по существу является списком Thing. Это будет выглядеть следующим образом:Как написать запрос LINQ для рекурсии?

Public Class Thing 
    Public Property Id As Guid 
    Public Property Children As List(Of Thing) 
End Class 

Теперь Учитывая существующий List(Of Thing), давайте назвал его aList ради этого примера, как я мог бы использовать LINQ для рекурсивного цикла бросить каждую вещь и детей, чтобы выяснить, если элемент существует во всей иерархии?

Dim aList As List(Of Thing)

В порядке слов, учитывая идентификатор, как бы я написать заявление LINQ против aList, чтобы увидеть, если этот идентификатор существует где-нибудь в иерархии?

Надеюсь, вы можете мне помочь и заблаговременно за ваш вклад!

+0

Написать рекурсивную функцию, которая принимает '' IEnumerable и 'Thing', чтобы соответствовать. –

+0

Просто любопытно, это код vb.Net. Вы хотите только решения VB? Если это так, вы должны добавить тег [tag: vb.net]. – ryanyuyu

+0

Будет что-то вроде 'aList.single (function (x) x.Id = refId)' не так ли? – Fjodr

ответ

2

Linq не предназначен для рекурсии и не справляется с этим. Есть способы, чтобы втиснуть его, но стандартная рекурсивная функция была бы гораздо чище и проще отлаживать:

Public Function IsInTree(Thing theThing, IEnumerable(Of Thing) tree) As Boolean 
    If tree.Any(Function(t) t.Id = theThing.Id) Then 
     IsInTree = True 
    ElseIf Children Is Not Nothing Then 
     IsInTree = tree.Any(Function(t) IsInTree(theThing, t.Children)) 
    Else 
     IsInTree = False 
    End If 
End Function 
+1

Я исправил проблему. Посмотрите, как он станет доступен. – Fjodr

+1

@Fjodr Спасибо за исправление. –

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