【发布时间】:2012-06-06 14:43:57
【问题描述】:
我有以下代码 -> 类似Select case using LINQ -
这不是实际代码 [从互联网上挑选]。
只是尝试使用 LINQ 显示 Select Case 概念。
在我的代码中,基于 条件 我正在创建新的 List 对象
Int32[] numbers = new Int32[] { 1, 2, 1, 3, 1, 5, 3, 1 };
var numberText =
(
from n in numbers
where n > 0
select new
{
Number = n,
Text =
(
n == 1 ? "One" :
n == 2 ? "Two" :
n == 3 ? "Three" : "Unknown"
)
}
);
但是,here 页面说 - “用多态性替换条件”。
那么,问题是这种实现是否是代码异味,是否应该始终严格避免?在循环遍历集合和有条件地创建新对象时,LINQ 似乎是一个显而易见的选择。可能是错的?
【问题讨论】:
-
但是参考页面说如果条件取决于类型,则用多态性替换条件。此条件取决于值,而不是类型,因此页面不适用。
-
除非您打算将 整个 32 位有符号整数集的英文 ASCII 表示嵌入到您的代码中,否则我会说这是一种非常难闻的气味 ;)
-
想想未来,你的条件会增长到 10 或更多。所以你的 switch 语句会增长太多,使 linq 看起来丑陋和复杂。
-
如果你有一个处理数字到单词的函数,它可能会更容易阅读代码。然后,您可以使用 switch 语句。我不确定编译器优化器是否会处理它,但它可能会产生更快、更紧凑的代码,而不是嵌套条件。
-
@zenwalker:那么,无论您是通过 switch、Linq 还是 if-else 来实现条件逻辑——>所有这些实现都有问题吗?问题与 LINQ 无关。问题是,是否每次都将所有此类逻辑转换为某种形式的多态实现?它更多的是一个概念性的 OO 相关问题,而不是严格的具体实现问题。
标签: c# linq refactoring