有没有人知道是否有办法使用列表测试列表成员资格。例如,我有一个名为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;
答案 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
中的每一个值中的一个。)