2009-10-29 136 views
3

如果我使用lambda表达式像下面C#Lambda表达式帮助

// assume sch_id is a property of the entity Schedules 
public void GetRecord(int id) 
{ 
    _myentity.Schedules.Where(x => x.sch_id == id)); 
} 

我假设(尽管未测试),我可以重写,使用使用的东西一个匿名内联函数像

_jve.Schedules.Where(delegate(Models.Schedules x) { return x.sch_id == id; }); 

我的问题是,我将如何重写,在一个正常的(非内联)功能,仍然通过ID参数。

回答

7

简短的回答是,你不能让它成为一个stand-along功能。在你的例子中,id实际上保存在closure中。

长的答案是,您可以编写一个类来捕获状态,方法是用要操作的id值进行初始化,并将其存储为成员变量。在内部,闭包的操作方式相似 - 区别在于它们实际上捕获对变量的引用,而不是其副本。这意味着闭包可以“看到”它们所绑定变量的变化。有关详细信息,请参阅上面的链接。

因此,举例来说:

public class IdSearcher 
{ 
    private int m_Id; // captures the state... 
    public IdSearcher(int id) { m_Id = id; } 
    public bool TestForId(in otherID) { return m_Id == otherID; } 
} 

// other code somewhere... 
public void GetRecord(int id) 
{ 
    var srchr = new IdSearcher(id); 
    _myentity.Schedules.Where(srchr.TestForId); 
} 
+1

ID不是封闭自己;它只是在关闭中存储的状态。 – 2009-10-29 17:52:28

0

您将需要保存在某个地方的ID。这是由using a closure为您完成,基本上就像创建一个单独的,具有值和方法的临时类。

1

如果你只想把委托其他地方的身体,你可以实现使用此

public void GetRecord(int id) 
{ 
    _myentity.Schedules.Where(x => MyMethodTooLongToPutInline(x, id)); 
} 
private bool MyMethodTooLongToPutInline(Models.Schedules x, int id) 
{ 
    //... 
}