繁体   English   中英

C#Lambda表达式帮助

[英]C# Lambda Expression Help

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

简短的答案是您无法使其成为独立功能。 在您的示例中, 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 );
}

如果您只想将委托人的身体放在其他地方,则可以使用此方法

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

您需要将ID保存在某个地方。 这是通过使用闭包为您完成的,它基本上就像使用值和方法创建一个单独的临时类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM