У меня есть иерархический список объектов. Предположим, что структура выглядит следующим образом:
- корневой узел
- Родительский узел
- Родительский узел
- Родительский узел
Дочерние узлы могут иметь своих собственных потомков, но цель состоит в основном в поиске «родительских узлов». Итак, допустим, что класс родительского узла имеет свойство «Имя» - и пользователь вводит частичное имя, я хочу, чтобы все родительские узлы, имя которых содержит критерии поиска пользователя, были возвращены. По сути, это больше функциональность «фильтра», чем все остальное. Итак, я знаю, как это сделать, однако проблема, с которой я сталкиваюсь, заключается в том, что их ключевая цель - сохранять иерархическую структуру в такте. Другими словами, если есть один родительский узел, который соответствует критериям фильтра, я хочу, чтобы была возвращена структура ниже:
- корневой узел
- Родительский узел
1036 **
Мои текущие усилия дают только:
Я использую Linq. Любые предложения будут с благодарностью.
Спасибо!
Chris
Фрагмент кода ниже для текущей реализации фильтра:
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;
}
}
}
}