【问题标题】:Alternative for multiple IF/CASE statements多个 IF/CASE 语句的替代方案
【发布时间】:2013-11-01 16:09:41
【问题描述】:

有没有办法避免 C# 中出现多个 IF/CASE 语句?

在我的应用程序中,我最终会使用 8 个以上的字段来创建 Linq 查询,其中每个表达式都可以为 null 或 != null,因此它会给我 64 个场景。

我没有提供任何代码示例,因为我可以使用 IF/CASE 来完成并尽可能简化它。

如果您熟悉解决该问题的一些有用方法,我将不胜感激。

代码示例(它只包括两个代表,但我必须添加更多来过滤数据)

存储库

    public virtual IEnumerable<T> Get(Expression<Func<T, bool>> filter = null, Expression<Func<T, bool>> filter1 = null)
            {
                IQueryable<T> query = dbSet;

                if (filter != null)
                {
                    query = query.Where(filter);
                    return query.ToList();
                }

                if (filter1 != null)
                {
                    query = query.Where(filter1);
                    return query.ToList();
                }
                else
               {
                    return query.ToList();
               }
            }

控制器

public ActionResult Index(string searchFullName, string searchExtension)
    {
        var extensionList = new List<string>();
        var extensions = from n in unitofwork.DomainRepository.Get()
                         select n.Extension;
        extensionList.AddRange(extensions.Distinct());
        ViewBag.searchExtension = new SelectList(extensionList);
        if (!String.IsNullOrEmpty(searchFullName) && !String.IsNullOrEmpty(searchExtension))
        {
            return View(unitofwork.DomainRepository.Get(n => n.Extension == searchExtension && n.Name.Contains(searchFullName)));
        }
        else if (!String.IsNullOrEmpty(searchExtension))
        {
            return View(unitofwork.DomainRepository.Get(n => n.Extension == searchExtension));
        }
        else if (String.IsNullOrEmpty(searchFullName) && String.IsNullOrEmpty(searchExtension))
        {
            return View(unitofwork.DomainRepository.Get());
        }
        else if (!String.IsNullOrEmpty(searchFullName) && String.IsNullOrEmpty(searchExtension))
        {
            return View(unitofwork.DomainRepository.Get(n => n.Name.Contains(searchFullName)));
        }
        else
        {
            return View(unitofwork.DomainRepository.Get());
        }
    }

【问题讨论】:

  • “我没有提供任何代码示例” - 你真的应该这样做,因为 “8+ 个字段 ... LINQ ... 64 个场景” i> 没有多大意义。我们将不得不猜测您的意思,这无助于回答的准确性。
  • 这取决于你想要做什么。在您的问题中包含一些代码,否则我们无法为您提供任何有用的帮助。
  • 试试switch-case,请提供一些代码。
  • 说真的,如果你不想费心提供代码示例,我也不会费心提供避免多个 ifs/cases 的建议。
  • 整个想法是向社区询问有关该问题的可能不同方法的问题,然后尝试实现它,而不是编写 200 行长的代码并将其粘贴为我的一部分问题...

标签: c# asp.net-mvc if-statement switch-statement


【解决方案1】:

是的,这是可能的,使用 Linq 强大的 Aggregate 方法(函数式编程中 fold 函数的一个版本)。

public virtual IEnumerable<T> FilterOnAll(params Expression<Predicate<T> filters)
{
    return filters.Aggregate(dbSet, (acc, element) => acc.Where(element));
}

public virtual IEnumerable<T> FilterOnAny(params Expression<Predicate<T> filters)
{
    Expression<Predicate<T>> alwaysTrue = _ => true;
    var compositeFilter = filters.Aggregate(alwaysTrue, (acc, element) => acc.Or(element));
    return dbSet.Where(compositeFilter);
}

然后,您可以组合这两个构建器,在控制器中创建几乎任何您想要的逻辑条件。

祝你好运。

【讨论】:

  • 谢谢。这正是我想要的。
【解决方案2】:

你可以在 where 子句中使用 or 语句

where (variable1 == null || b.data = variable1) 如果我理解你的问题,如果它为空,则对所有 8 人都这样做

【讨论】:

    【解决方案3】:

    您的整个 if .. elseif .. else 块可以替换为:

    return View(unitofwork.DomainRepository.Get(n => 
         (string.IsNullOrEmpty(searchFullName)  || n.Name.Contains(searchFullName))
      && (string.IsNullOrEmpty(searchExtension) || n.Extension == searchExtension)));
    

    【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多