У меня есть иерархический список объектов. Предположим, что структура выглядит следующим образом:Поиск иерархического списка рекурсивно
- корневого узла
- родительского узла
- дочернего узла
- родительского узла
- дочернего узла
- родительский узел
- дочерний узел
- родительского узла
Дочерние узлы могут иметь своих собственных детей, но цель состоит в том, чтобы в основном искать «родительские узлы». Итак, предположим, что класс родительского узла имеет свойство «Имя» - и пользователь вводит частичное имя, я хочу, чтобы все родительские узлы, чье имя содержит критерии поиска пользователя, которые будут возвращены. В принципе, это больше функциональность «фильтра», чем что-либо. Итак, я знаю, как это сделать, однако проблема, с которой я сталкиваюсь, заключается в том, что главная цель - поддерживать иерархическую структуру в такте. Другими словами, если есть один родительский узел, который соответствует критериям фильтра, я хочу структуру ниже должны быть возвращены:
- Корневой узел
- Родительский узел
- дочерний узел
- Родительский узел
Мои текущие усилия:
- Родительский узел
- дочерний узел
Я использую 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;
}
}
}
}
Не могли бы вы предоставить нам более подробную информацию? Какой тип коллекции является вашим иерархическим списком? Являются ли дочерние узлы инкапсулированы в родительские узлы или связаны с ними в структуре типа дерева? Фрагменты кода хороши! –
Коллекция представляет собой ObservableCollection. Каждый узел имеет свойство «Дети» - это коллекция IEnumerable того же класса. Поэтому, чтобы простое выполнение этого требования, используя метод (ы) расширения или какой-либо другой чистый подход, могу ли я фильтровать исходные дочерние узлы корневого узла и по-прежнему удерживать корневой узел в такте? – Chris
Я думаю, что мне нужно будет иметь две коллекции. Одна коллекция - это оригинальная коллекция объектов, а вторая коллекция будет моей динамической коллекцией, которая представляет отфильтрованные результаты. Я также не хочу предполагать, что у меня всегда будет только один корневой узел. – Chris