如何将带有外部参数的lambda放入回调函数中

时间:2013-06-02 19:26:04

标签: c# linq lambda callback

我有以下代码基本上可以做我想要的:

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参数赋予该回调方法。

这甚至可能吗?

1 个答案:

答案 0 :(得分: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;
}