0

有没有办法让下面的 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();
    } 
4

5 回答 5

6
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();
   } 
于 2013-08-14T11:47:01.087 回答
3

国王打败了我。尽管这不是您所要求的,但为了提高可读性,我还建议您创建一个具有更有意义名称的单独方法。这条逻辑链可能会掩盖您正在做的事情的意图。将其提取到方法中将有助于阐明方法的意图。我会把它放在对 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;
    }
于 2013-08-14T11:50:06.507 回答
2

金的回答是要走的路,但您似乎也可以这样做。

FilterType[] notTheseFilters = new FilterType[] { FilterType.A, FilterType.B...};
bool result = !Filters.Any(f =>
                    notTheseFilters.Contains(ConvertFilterType(f.FilterTypeId)));
于 2013-08-14T12:00:18.843 回答
0

如果我的逻辑对我有用,你也可以这样做

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 查询中就不需要括号了。

于 2013-08-14T12:03:49.570 回答
0

要扩展 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;
}
于 2013-08-14T12:52:22.360 回答