谓词和列表

时间:2010-03-16 14:42:57

标签: c# list predicate findall

我有一个通用列表。

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

所以,这就是我的想法:

这是我的谓词:

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

4 个答案:

答案 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的委托,而不是直接调用函数

(假设rootList<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的答案是最好的,因为它:

  1. 不使用LINQ(提问者正在使用VS 2005)
  2. 不使用lambda表达式(同样,VS 2005)
  3. 那就是说,为什么不通过编写一个函数来为你自己创建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));