【问题标题】:How to put a lambda with external parameters into a callback function如何将带有外部参数的 lambda 放入回调函数中
【发布时间】:2013-06-02 19:26:03
【问题描述】:

我有以下代码,基本上可以满足我的要求:

string firstName = "Chuck";
string lastName = "Norris";

 filtered = dvds.Where(
            dvd => (dvd.Element("Actors") != null) && (dvd.Element("Actors").Elements("Actor").Where(
                actor => actor.Attribute("FirstName") != null && actor.Attribute("FirstName").Value == firstName 
                    && actor.Attribute("LastName") != null && actor.Attribute("LastName").Value == lastName)).Count() > 0);

如您所见,lambda 相当大。我宁愿在第一个 .Where 调用中有一个回调方法。但我不知道如何将 firstName 和 lastName 参数提供给该回调方法。

这可能吗?

【问题讨论】:

    标签: c# linq lambda callback


    【解决方案1】:

    您不能只将方法传递给第一个 Where,因为您还需要传递名字和姓氏,但您可以传递一个更简单的 lambda... 这是一个可能的重构:

    filtered = dvds.Where(dvd => HasActor(dvd, firstName, lastName));
    ...
    
    bool HasActor(XElement dvd, string firstName, string lastName)
    {
        var actors = dvd.Element("Actors");
        if (actors != null)
        [
            var actor = actor.FirstOrDefault(a => IsActor(a, firstName, lastName));
            return actor != null;
        }
        return false;
    }
    
    bool IsActor(XElement actor, string firstName, string lastName)
    {
        string firstNameAttr = actor.Attribute("FirstName");
        string lastNameAttr = actor.Attribute("LastName");
        return firstNameAttr != null
            && firstNameAttr.Value == firstName
            && lastNameAttr != null
            && lastNameAttr.Value == lastName;
    }
    

    【讨论】:

    • 拍脑袋 有时你只见树木不见森林。当然(!)我可以只调用另一个方法并传递附加参数。现在我觉得自己很愚蠢。 :-/
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2015-02-16
    • 2017-12-25
    • 1970-01-01
    • 2015-08-29
    • 2023-03-08
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多