我有以下代码基本上可以做我想要的:
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参数赋予该回调方法。
这甚至可能吗?
答案 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;
}