C # Лямбда Выражение Справка - PullRequest
3 голосов
/ 29 октября 2009

Если я использую лямбда-выражение, подобное следующему

// 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 голосов
/ 29 октября 2009

Короткий ответ: вы не можете сделать это функцией ожидания. В вашем примере 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 голос
/ 29 октября 2009

Если вы хотите разместить тело делегата где-то еще, вы можете достичь этого

public void GetRecord(int id)
{
    _myentity.Schedules.Where(x => MyMethodTooLongToPutInline(x, id));
}
private bool MyMethodTooLongToPutInline(Models.Schedules x, int id)
{
    //...
}
0 голосов
/ 29 октября 2009

Вам нужно будет где-нибудь сохранить идентификатор. Это делается для вас с помощью с использованием замыкания , которое в основном похоже на создание отдельного временного класса со значением и методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...