C# Lambda表达式帮助

3
如果我使用以下类似的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个回答

7
简短的答案是,您无法将其作为一个独立的函数。在您的示例中,id实际上被保留在闭包中。
长话短说,您可以编写一个类来捕获状态,通过使用要操作的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本身不是闭包;它只是存储于闭包内部的状态。 - Jon Skeet

1
如果您只想将委托的主体放在其他地方,可以使用以下方法实现。
public void GetRecord(int id)
{
    _myentity.Schedules.Where(x => MyMethodTooLongToPutInline(x, id));
}
private bool MyMethodTooLongToPutInline(Models.Schedules x, int id)
{
    //...
}

0

你需要在某个地方保存这个ID。这可以通过使用闭包来实现,它基本上就像创建一个带有值和方法的单独临时类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接