我有以下代码 - >像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似乎是一个明显的选择。可能是错的?
答案 0 :(得分:2)
您发布的文章是正确的,但该文章根本不适用于您的查询示例。条件语句确实有用。
在该示例中,整个方法(可能还有整个对象)根据对象的单个值更改其行为(甚至将其命名为_type
,这表明了该目的)。这确实是多态的情况,因为代替字段_type
,您可以使用不同的类来表示每种类型,从而不需要这样的switch语句。
但在你的情况下,它只是从一个值到另一个值的转换
它不会改变整个对象的行为。
我可以考虑实现一些将条件逻辑移出查询体的转换器,否则,代码就可以了。
答案 1 :(得分:1)
有一个基本的差异。 LINQ是一个允许您查询集合的API(正如您在问题中所演示的那样)。开关(或其他条件)语句用于控制程序流程。
当您有大量基于某种类型控制程序流的条件语句时,您所指的页面正在讨论重构代码 - 在这种情况下,它表明您可能希望用一些多态来替换所有条件。所以在这种情况下会有代码味道。但是在LINQ语句中使用条件是可以的 - 可能有很多方法来构造你的LINQ - 有些方法比其他方法表现更好,有些方法比其他方法读得更好,但我不会说在LINQ中使用条件是一种代码味道。 / p>