【问题标题】:LINQ with generic Predicate constraint具有通用谓词约束的 LINQ
【发布时间】:2010-11-02 14:01:37
【问题描述】:

我刚刚将我的项目升级到 .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>;
    }

但我得到“Delegate 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 调用中为谓词编写代码。我显然需要能够验证传入的表单不为空,并且我需要能够检查它是否与我正在寻找的类型匹配。

【问题讨论】:

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


    【解决方案1】:
    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 类型。

    【讨论】:

    • 谢谢,完美!我能够弄清楚调用应该是: List mainWindows = Program.windowManager.FindOpenWindows((Form f) => f is frmMain);
    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多