lambda/LINQ中的变量
本文关键字:变量 LINQ lambda | 更新日期: 2023-09-27 18:27:49
下面的lambda表达式有没有办法将方法调用ConvertFilterType(filter.FilterTypeId)
移动到变量中,这样就不会对每个条件重复调用它?
这个if语句确保集合包含所有必需的筛选器。
if (run.Filters.All(
filter => (ConvertFilterType(filter.FilterTypeId) != FilterType.A)
&& (ConvertFilterType(filter.FilterTypeId) != FilterType.B)
&& (ConvertFilterType(filter.FilterTypeId) != FilterType.C)
&& (ConvertFilterType(filter.FilterTypeId) != FilterType.D)
&& (ConvertFilterType(filter.FilterTypeId) != FilterType.E)))
{
throw new ArgumentException();
}
if (run.Filters.All(
filter => {
FilterType t = ConvertFilterType(filter.FilterTypeId);
return
t != FilterType.A && t != FilterType.B && t != FilterType.C && t != FilterType.D && t != FilterType.E;
}))
{
throw new ArgumentException();
}
King击败了我。虽然这不是你所要求的,但为了提高可读性,我也建议你创建一个名称更有意义的单独方法。这个逻辑链可能会模糊你正在做的事情的意图。将其提取到方法中将有助于阐明该方法的意图。我本想把这个放在对King帖子的评论中,但还没有这个名声。
这里有一些示例代码,尽管我不知道Filters集合中的项目类型,以了解方法的参数需要是什么
if (run.Filters.All(filter => { return IsFilterAllowed(filter); } )
{
throw new ArgumentException();
}
private bool IsFilterAllowed(FiltersItemType filter)
{
FilterType t = ConvertFilterType(filter.FilterTypeId);
return
t != FilterType.A &&
t != FilterType.B &&
t != FilterType.C &&
t != FilterType.D &&
t != FilterType.E;
}
King的答案是可行的,但你似乎也可以这样做吗。
FilterType[] notTheseFilters = new FilterType[] { FilterType.A, FilterType.B...};
bool result = !Filters.Any(f =>
notTheseFilters.Contains(ConvertFilterType(f.FilterTypeId)));
如果我的逻辑正确,你也可以做这个
var filterTypesToAvoid = new[]{
FilterType.A,
FilterType.B,
FilterType.C,
FilterType.D,
FilterType.E
};
if (run.Filters.All(
filter => !filterTypesToAvoid.Contains(ConvertFilterType(filter.FilterTypeId))
))
{
throw new ArgumentException();
}
这样,LINQ查询中就不需要括号了。
要扩展brader24的建议,您可以尝试:
if (run.Filters.All(IsFilterAllowed))
{
throw new ArgumentException();
}
private bool IsFilterAllowed(FiltersItemType filter)
{
FilterType t = ConvertFilterType(filter.FilterTypeId);
return
t != FilterType.A &&
t != FilterType.B &&
t != FilterType.C &&
t != FilterType.D &&
t != FilterType.E;
}