使用List <t> </t> </t>测试List <t>成员资格

时间:2009-08-06 21:40:52

标签: c# linq lambda

有没有人知道是否有办法使用列表测试列表成员资格。例如,我有一个名为Membership的类,它具有属性Rebates,类型为List<Enums.RebateType>。我想测试使用lambda表达式来查看该列表是否包含任何特定类型的回扣。我的原始lambda表达式如下

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)); 

我想知道是否可以通过一个Lambda表达式完成类似于以下模拟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 个答案:

答案 0 :(得分:4)

听起来像你想要的那样:


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 :(得分:1)

除了Marc的建议外,我还建议ValidRebateTypes成为HashSet<Enums.RebateType>。这不仅可能更有效(尽管可能不是一小部分),它也会显示您的意图(即,其中只有RebateType中的每一个值中的一个。)