C#/ LINQ / Select Case:这是代码味道吗?

时间:2012-06-06 14:43:57

标签: c# linq refactoring

我有以下代码 - >像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似乎是一个明显的选择。可能是错的?

2 个答案:

答案 0 :(得分:2)

您发布的文章是正确的,但该文章根本不适用于您的查询示例。条件语句确实有用。

在该示例中,整个方法(可能还有整个对象)根据对象的单个值更改其行为(甚至将其命名为_type,这表明了该目的)。这确实是多态的情况,因为代替字段_type,您可以使用不同的类来表示每种类型,从而不需要这样的switch语句。

但在你的情况下,它只是从一个值到另一个值的转换 它不会改变整个对象的行为。
我可以考虑实现一些将条件逻辑移出查询体的转换器,否则,代码就可以了。

答案 1 :(得分:1)

有一个基本的差异。 LINQ是一个允许您查询集合的API(正如您在问题中所演示的那样)。开关(或其他条件)语句用于控制程序流程。

当您有大量基于某种类型控制程序流的条件语句时,您所指的页面正在讨论重构代码 - 在这种情况下,它表明您可能希望用一些多态来替换所有条件。所以在这种情况下会有代码味道。但是在LINQ语句中使用条件是可以的 - 可能有很多方法来构造你的LINQ - 有些方法比其他方法表现更好,有些方法比其他方法读得更好,但我不会说在LINQ中使用条件是一种代码味道。 / p>