2010-03-16 185 views
0

我有一个通用列表。谓词和列表

此列表的某些元素属于父元素。我从数据库中检索所有这些元素,并且我想递归地与它们构建一棵树。

所以,这里是我在想什么:

这里是我的谓词:

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 :(

+3

@George:如果你不知道,你可以'返回catMapping.parentId == parentId',你不需要if/else语句。 – 2010-03-16 17:08:52

回答

3

尝试

root.childrenElements = 
    root 
     .Where(i => i.parentId == yourCatMapping.parentId) 
     .ToArray(); 

编辑

.NET 2.0中,我认为这是

root.FindAll(
    delegate(CategoryMapping mapping) 
     { 
      return mapping.parentId == root.Id; 
     }); 
+0

Asker是.net 2.0,因此没有linq – 2010-03-16 17:09:44

+1

@Binary Worrier:问题的PS是最近;) – Gregoire 2010-03-16 18:12:09

+0

难以置信,我的不好:) – 2010-03-16 20:59:57

1

你需要指定一个代表传递给FindAll,而不是直接函数调用

(假设rootList<CategoryMapping>

root.childrenElements = root.FindAll(c => FindChildren(root.id, c)); 
+0

乔治使用VS 2005,所以lambda表达式不会工作。他需要使用'delegate'语法。 – 2010-03-16 18:26:18

0

格雷瓜尔的回答是最好的,因为它:

  1. 不使用LINQ(提问者使用VS 2005)
  2. 不使用lambda表达式(再次,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)); 
+0

伟大的职位丹。它为我清除了一些东西。感谢大家!太棒了。非常感谢,我对此很疯狂。 – 2010-03-16 18:48:23