64 个嵌套的 If/Else 语句是不是不好?

Posted

技术标签:

【中文标题】64 个嵌套的 If/Else 语句是不是不好?【英文标题】:Are 64 nested If/Else statements bad?64 个嵌套的 If/Else 语句是否不好? 【发布时间】:2021-12-22 22:39:07 【问题描述】:

我有点进退两难。我必须对列表进行一些排序。用户可以从 2 个列表中选择,然后选择该列表中的一个元素进行排序。对我来说不幸的是,第二个列表是第一个列表中的子列表。

如果用户只是从父列表中选择,子列表将需要稍微不同的逻辑。我有逻辑可以使用 LINQ 对父列表和/或子列表进行排序,所以我不太担心它的逻辑。

还可以选择升序或降序来使事情变得更糟,至少对我来说是这样。我已经完成了逻辑,看起来总共需要使用 64 个 if/else 语句来合并所有场景。

我的第一反应是,这不是一个很好的解决方法,因为这似乎有很多 if/else 语句。有没有更好的方法来解决这个问题,还是我只需要硬着头皮:

父逻辑:

Positions.Select(x => x.Product).OrderBy(x=>x.Price).AsQueryable();

儿童逻辑:

Positions.Select(x => x.Product).OrderBy(x=>x.Performance.OrderBy(c=>c.AssortmentCategory).Select(c=>c.AssortmentCategory).FirstOrDefault()).AsQueryable();

Positions 和 Performance 都是 ListExtended 的,如果这很重要的话。此外,我正在使用动态 LINQ 库,因为我将获得用户输入,尽管上面没有显示。

Edit1:我忘了说这仅对父列表进行排序。即使他们从子列表中选择一个元素,它也会对父列表进行排序。

【问题讨论】:

使用大量 if/else 可能会降低性能,但它是如此之少,以至于它永远不会影响您的程序。如果你不想让每个人都开心,你可以使用 switch 语句。 基本上,代码中的每个条件(例如ifcase)都会为循环复杂度(CC)增加+1,本质上是量度代码中的代码路径。把它想象成一个岔路口。开车从 A 到 B 走那条高速公路总是比走郊区的后街好。对 CC 进行高度衡量的最大影响是对单元测试,因为这意味着他们必须考虑所有变化您的代码状态可以采取的措施。 blog.ndepend.com/understanding-cyclomatic-complexity 我不太明白你在说什么(更多代码会很有用)。我怀疑您可能能够使用 Predicate Builder (albahari.com/nutshell/predicatebuilder.aspx) 之类的东西来构建列名和可组合查询部分的字典(可能是字典),并通过查找某些东西来动态构建查询(而不是通过构建逻辑) if/else if 语句的迷宫 另一个大的圈复杂性打击是可理解性和可维护性。不用担心性能,担心你的代码会变得多复杂。 【参考方案1】:

我会有一个查找字典,它将选择从第一个列表(字符串,int,?不确定您需要什么类型)映射到 Func 并执行

var sortedData = sortDict[selected](args....)

【讨论】:

...和Dictionary<>s 非常适合折叠您从多个if/else 获得的所有圈复杂度。 +1

以上是关于64 个嵌套的 If/Else 语句是不是不好?的主要内容,如果未能解决你的问题,请参考以下文章

java,多层for()循环,if()else嵌套分别用啥替代?

if--else 嵌套 怎么理解?

一万个if..........else....语句,请问如何去优化它。。。。以提升性能效率

如何优化这段if else多层嵌套?

arttemplate if else 能不能嵌套

C语言中三个if语句的嵌套怎理解