Проверка членства в List <T>с использованием List <T> - PullRequest
1 голос
/ 07 августа 2009

Кто-нибудь знает, есть ли способ проверить членство в списке, используя список? Например, у меня есть класс с именем Membership, который имеет свойство Rebates типа List<Enums.RebateType>. Я хочу проверить, используя лямбда-выражение, чтобы увидеть, содержит ли этот список какие-либо скидки, которые имеют определенный тип. Мое оригинальное лямбда-выражение выглядит следующим образом

return Membership.Rebates.Exists(rebate =>
    rebate.RebateType == Enums.RebateType.A &&
    rebate.RebateStatus == Enums.RebateStatus.Approved); 

Вместо того, чтобы делать следующее:

return Membership.Rebates.Exists(rebate =>
   (rebate.RebateType == Enums.RebateType.A &&
    rebate.RebateStatus == Enums.RebateStatus.Approved) ||
   (rebate.RebateType == Enums.RebateType.B &&
    rebate.RebateStatus == Enums.RebateStatus.Approved)); 

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

SELECT COUNT(*)
FROM Membership.Rebates
WHERE RebateType IN (ValidRebateTypes) AND Approved = true

ValidRebateTypes - это, безусловно, List<Enums.RebateType>, который я тестирую, т. Е. ValidRebateTypes = (Enums.RebateType.A, Enums.RebateType.B).

Работа вокруг меня в настоящее время выглядит следующим образом:

bool exists = false;
foreach (Enums.RebateType rebateType in ValidRebateTypes())
{
    exists =  Membership.Rebates.Exists(
                rebate =>
                rebate.RebateType == rebateType &&
                rebate.RebateStatus == Enums.RebateStatus.Approved);
    if (exists) { break; }
}
return exists;

Ответы [ 2 ]

4 голосов
/ 07 августа 2009

Звучит так, как вы хотите:


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType)
                              && r.RebateStatus == Enums.RebateStatus.Approved);

Затем вы можете использовать .Count () для подсчета:


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType) 
                              && r.RebateStatus == Enums.RebateStatus.Approved)
                  .Count();

Или .Any () для определения существования любого, удовлетворяющего этому условию


Membership.Rebates.Any(r => ValidRebateTypes.Contains(r.RebateType) 
                            && r.RebateStatus == Enums.RebateStatus.Approved);
1 голос
/ 07 августа 2009

В дополнение к предложению Марка, я бы рекомендовал сделать ValidRebateTypes a HashSet<Enums.RebateType>. Мало того, что это, вероятно, будет более эффективным (хотя, возможно, не для небольшого набора), оно также показывает ваше намерение (то есть, что в нем присутствует только одно из каждого значения RebateType).

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