Предикаты и списки
Вопрос
У меня есть общий список.
Некоторые элементы этого списка принадлежат родительскому элементу.Я получил все эти элементы из базы данных и хочу рекурсивно построить с их помощью дерево.
Итак, вот что я думаю:
Вот мой предикат:
public static bool FindChildren(Int32 parentId,CategoryMapping catMapping)
{
if (catMapping.parentId == parentId)
{
return true;
}
else
{
return false;
}
}
root = list[0];
root.childrenElements = root.FindAll(FindChildren(root.id,???)
Я не могу понять, как это будет работать.Как я могу сделать такой предикат?
ПС:Я использую VS2005 :(
Решение
Пытаться
root.childrenElements =
root
.Where( i => i.parentId == yourCatMapping.parentId)
.ToArray();
РЕДАКТИРОВАТЬ
Я думаю, что в .net 2.0 это так.
root.FindAll(
delegate(CategoryMapping mapping)
{
return mapping.parentId == root.Id;
});
Другие советы
Вам нужно указать делегата для перехода к FindAll
, а не прямой вызов функции
(при условии root
является List<CategoryMapping>
)
root.childrenElements = root.FindAll(c => FindChildren(root.id, c));
Вам стоит заглянуть в эту тему, которую я начал Формирование хороших делегатов предикатов для Find() или FindAll() в списке для С#/.NET 2.0
Это довольно четко отвечает на ваш вопрос.
Ответ Грегуара — лучший, потому что он:
- Не использует LINQ (спрашивающий использует VS 2005)
- Не использует лямбда-выражение (опять же, VS 2005).
Тем не менее, почему бы не упростить себе задачу (немного) написав функцию для генерации вашего Predicate
для ты:
public static Predicate<CategoryMapping> GetIsChildOf(int parentId) {
return delegate(CategoryMapping cm) {
return cm.parentId == parentId;
};
}
Тогда, если у вас есть List<CategoryMapping>
и вы хотите найти все элементы с определенным parentId
недвижимость, вы можете просто позвонить:
root = list[0];
root.childrenElements = list.FindAll(GetIsChildOf(root.id));