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

C# 如何将带有外部参数的lambda放入回调函数中,c#,linq,lambda,callback,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.Att

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

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参数输入到该回调方法中


这可能吗?

您不能只将方法传递给第一个
位置,因为您还需要传递名字和姓氏,但可以传递更简单的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;
}

您不能只将方法传递给第一个
,其中
,因为您还需要传递名字和姓氏,但您可以传递一个更简单的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;
}
有时你看不见森林,只看到树木。当然(!)我可以调用另一个方法并传递附加参数。现在我觉得自己很愚蠢-/有时你看不见森林,只看到树木。当然(!)我可以调用另一个方法并传递附加参数。现在我觉得自己很愚蠢-/