2013-06-02 17 views
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参数放入该回调方法中。

这可能吗?

回答

1

你不能只通过一种方法来第一Where,因为你还需要通过姓氏和名字,但你可以通过一个简单的拉姆达......这里是一个可能的重构:

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; 
} 
+0

*拍拍头* 有时你看不到树林。 当然(!)我可以调用另一个方法并传递附加参数。 现在我感到很蠢。 : - / –