LINQ具有通用谓词约束

时间:2009-06-12 19:38:14

标签: c# visual-studio-2008 linq .net-3.5 lambda

我刚刚将我的项目升级到.NET 3.5,并认为我完全使用LINQ。我的应用程序有一个窗口管理器,可以在运行时跟踪打开的窗口,我正在尝试添加FindOpenWindows泛型方法。到目前为止我做了什么:

    List<Form> openWindows;

    public List<T> FindOpenWindows<T>(Predicate<T> constraint)
    {
        var foundTs = from form in openWindows
                          where constraint(form)
                                && form.Created
                          select form;

        return foundTs as List<T>;
    }

但我得到了“委托System.Predicate有一些无效的论点。”所以我把方法重写为:

    public List<T> FindOpenWindows<T>(Predicate<Form> constraint)
    {
        var foundTs = from form in openWindows
                          where constraint(form as Form)
                                && form.Created
                          select form;

        return foundTs as List<T>;
    }

我没有使该函数非泛型的原因是调用者获得了一个他们正在寻找的窗口类型的列表。

由于我是LINQ和Lambda表达式的新手,我不确定如何在FindOpenWindows调用中编写Predicate的代码。我显然需要能够验证传入的表单是否为空,我需要能够检查它是否与我正在寻找的类型匹配。

1 个答案:

答案 0 :(得分:2)

public List<T> FindOpenWindows<T>(Predicate<T> constraint)
   where T : Form
{
    var foundTs = from form in openWindows
                      where constraint(form)
                            && form.Created
                      select form;

    return foundTs.ToList();
}

试试吧。您需要将T限制为Form类型。