1

私は基本的に私が望むことをする次のコードを持っています:

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);

ご覧のとおり、ラムダはかなり大きいです。最初の .Where 呼び出しにコールバック メソッドが必要です。しかし、そのコールバック メソッドに firstName パラメーターと lastName パラメーターを与える方法がわかりません。

それは可能ですか?

4

1 に答える 1

1

Where姓名も渡す必要があるため、 first にメソッドを渡すだけでは不十分ですが、より単純なラムダを渡すことができます...リファクタリングの可能性は次のとおりです。

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;
}
于 2013-06-02T19:33:40.303 に答える