我有一個分層的對象列表。假設結構如下:遞歸搜索分層列表
- 根節點
- 父節點
- 子節點
- 父節點
- 子節點
- 父節點
- 子節點
- 父節點
子節點可以有自己的孩子,但目標是基本搜索「父節點」。所以,假設父節點類有一個名爲「Name」的屬性 - 並且用戶輸入了一個部分名稱,我想要返回其名稱中包含用戶搜索條件的所有父節點。基本上,這比其他任何東西都更具「過濾」功能。所以,我知道如何做到這一點,但是我遇到的問題是他們的主要目標是保持層級結構的機智。換句話說,如果有符合過濾條件的一個父節點,我想下面要返回的結構:
- 根節點
- 父節點
- 子節點
- 父節點
我目前的努力只產生:
- 父節點
我使用LINQ
- 子節點。任何建議將不勝感激。
謝謝!
克里斯
代碼片斷低於當前濾波器的實現:
FilteredReports = Reports.FirstOrDefault().Children.Cast<IHierarchicalResult>() .SelectRecursive(item => item.Children.Cast<IHierarchicalResult>()) .Where(item => item.Name.ToLower().StartsWith(filterCriteria)) .ToObservableCollection();
這裏是擴展方法,我使用:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> getChildren) { if (null == source) { throw new ArgumentNullException("source"); } if (null == getChildren) return source; return SelectRecursiveIterator(source, getChildren); } private static IEnumerable<T> SelectRecursiveIterator<T>(IEnumerable<T> source, Func<T, IEnumerable<T>> getChildren) { foreach (T item in source) { yield return item; IEnumerable<T> children = getChildren(item); if (null != children) { foreach (T child in SelectRecursiveIterator(children, getChildren)) { yield return child; } } } }
您能否給我們提供更多信息?你的分層列表是什麼類型的集合?子節點是封裝在父節點中還是與樹型結構相關聯?代碼片段很好! – 2010-11-15 16:12:17
集合是一個ObservableCollection。每個節點都有一個名爲Children的屬性 - 這是同一類的IEnumerable集合。因此,爲了保持這個要求簡單,使用擴展方法或其他一些乾淨的方法,我可以過濾根節點的初始子節點,並且仍然保持根節點的機制? – Chris 2010-11-15 16:21:14
我認爲我需要有兩個集合。一個集合是對象的原始集合,第二個集合將是我的動態集合,它表示已過濾的結果。我也不想假設我總是隻有一個根節點。 – Chris 2010-11-15 16:21:46