C#Lambda表达式帮助

时间:2009-10-29 17:22:19

标签: c# lambda

如果我使用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参数。

3 个答案:

答案 0 :(得分:7)

简短的回答是你无法使它成为一个独立的功能。在您的示例中,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 :(得分:1)

如果您只想将委托的正文放在其他地方,则可以使用此

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

答案 2 :(得分:0)

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