Как заменить лямбду, написанную в предложении Where в Linq, эквивалентным делегатом - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть выражение Query, которое использует тип предиката и лямбда-выражение. Я получаю желаемый результат с этим. Но мне не ясно, как оценивается это выражение.

Я попытался разбить это лямбда-выражение, создав делегат и заменив условие в Where типом делегата.

Если мне придется переписать то же самое с написанием делегата вместо анонимного типа. Какой будет синтаксис. Как делегат будет возвращен для того же.

if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
    .Where(row => row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1)
{
  List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
}

Ответы [ 2 ]

1 голос
/ 17 сентября 2010
void MethodSignature(...) 
{ 
  ...  

  if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
    .Where(RowCondition)
  {
    List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
  }

  ...
}

// Where want a Func<T,bool> parameter 
// T is the first parameter type (DataRow here)
// bool represents the return value
bool RowCondition(DataRow row)
{
  return row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1
}
1 голос
/ 17 сентября 2010

Я полагаю, что правильная замена делегата была бы:

        if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable().Where(
            delegate(DataRow row) {
                return (row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId.Count() > 1); 
            }))
        {
            List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
        }

Но для меня утро, так что прости меня, если я немного не в себе.

Какое желание?дать DataRow в качестве параметра и bool для возврата.Вы можете просто добавить что-нибудь в лямбду или делегат, если они соответствуют этим запросам.

На ваш вопрос, почему он запрашивает Func <> и как он работает.Вы используете оператор LINQ, поэтому я нашел вам ссылку на это, которая, вероятно, может объяснить это лучше меня: http://blogs.msdn.com/b/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx

Но да, последний тип здесь в Func <> это то, что онвозвращается.(Тем не менее, я все же могу рекомендовать использовать лямбда-выражение, так как оно довольно чистое, аккуратное и лучше всего подходит для Func <>.

(Кроме того, посмотрите, что дает вам интеллект, когда вы пишете "new Func <.... ", это должно дать вам хорошее представление о том, что Func хочет и может сделать!) </p>

Надеюсь, я вам помог.

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