2015-12-21 2 views
-1

Я немного смущен, что означает нижеприведенные утверждения.Linq Func аргумент

List<Func<GroupInfoInfo, bool>>() 

Groups.Instance.GetGroup(2, grp => TestPredicateGroup(whereCls, grp)); 

private static bool TestPredicateGroup(List<Func<GroupInfoInfo, bool>> predicates, GroupInfoInfo ri) 
{ 
    foreach (var p in predicates) 
    { 
     if (!p(ri)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Я хочу знать, что есть смысл List<Func<GroupInfoInfo, bool>>() и утверждение if (!p(ri)) в функции?

Некоторые путаницы в GetGroup() лямбда выражения также.

+0

[Список] (https://msdn.microsoft.com/en-us/library/6sh2ey19 (v = vs.110) .aspx) - это тип «Generic Collection» в 'C#'. –

+0

'предикаты' - это список функций, которые возвращают логическое значение. Поэтому правильно называть их в 'foreach' следующим образом:'! P (ri) ' –

ответ

4

List<Func<RoleInfo, bool>> - это список функций, которые принимают RoleInfo в качестве первого и единственного параметра и возвращают bool.

foreach (var p in predicates) выполняет итерации по всем функциям (предикаты), присваивает их p и проверяет их с помощью !p(ri).

!p(ri) фактически является вызов метода/делегата (присвоенным переменной p), давая первый аргумент ri который является RoleInfo. Результат отрицается, поэтому, если он возвращает false, результатом if является true. В этом случае он вернется false. Иначе он перейдет к следующему и проверит это, пока не проверит все предикаты. Если все они вернутся true, конечным результатом метода TestPredicateGroup является true.

+0

p (ri) выполнить в каком поле?, Я хочу задать по id p.rsid и ri.rsid? – skiskd

+0

'p' - это просто метод' (ri) 'просто передает параметры в методе. 'p' не будет иметь« rsid »,« ri ». –

Смежные вопросы