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

lambda/LINQ中的变量

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