我有一个通用列表。
此列表的某些元素属于父元素。我从数据库中检索了所有这些元素,我想用它们递归地构建一个树。
所以,这就是我的想法:
这是我的谓词:
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,???)
我无法弄清楚这是如何运作的。我怎么能做这种谓词?
PS:我正在使用VS2005 :(答案 0 :(得分:3)
尝试
root.childrenElements =
root
.Where( i => i.parentId == yourCatMapping.parentId)
.ToArray();
修改
在.net 2.0中我认为它是
root.FindAll(
delegate(CategoryMapping mapping)
{
return mapping.parentId == root.Id;
});
答案 1 :(得分:1)
您需要指定要传递给FindAll
的委托,而不是直接调用函数
(假设root
为List<CategoryMapping>
)
root.childrenElements = root.FindAll(c => FindChildren(root.id, c));
答案 2 :(得分:1)
您应该查看我在Forming good predicate delegates to Find() or FindAll() in a List上为C#/ .NET 2.0
启动的这个主题它非常清楚地回答了你的问题。
答案 3 :(得分:0)
Gregoire的答案是最好的,因为它:
那就是说,为什么不通过编写一个函数来为你自己创建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));