C# C/LINQ/Select案例:这是代码气味吗?

C# C/LINQ/Select案例:这是代码气味吗?,c#,linq,refactoring,C#,Linq,Refactoring,我有以下代码->类似于使用LINQ选择案例- 这不是[从互联网上选取的]实际代码。 只是尝试使用LINQ显示Select Case概念。 在我的代码中,根据创建新列表对象的条件 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,

我有以下代码->类似于使用LINQ选择案例- 这不是[从互联网上选取的]实际代码。 只是尝试使用LINQ显示Select Case概念。 在我的代码中,根据创建新列表对象的条件

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"
        )
    }
);
但是,页面上说-用多态性替换条件


因此,问题是这种实现是否是一种代码味道,是否应该始终严格避免?在循环集合和有条件地创建新对象时,LINQ似乎是一个明显的选择。可能是它错了吗?

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


您所指的页面是关于重构代码的,当您有许多基于某种类型控制程序流的条件语句时——在本例中,它表明您可能希望用某种多态射替换所有条件语句。所以在这种情况下,有一种代码气味。但是在LINQ语句中使用条件是可以的-可能有很多方法来构造您的LINQ-一些方法会比其他方法更好,一些方法会比其他方法更好,但我不会说在LINQ中使用条件是一种代码味道。

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

在本例中,整个方法以及可能整个对象基于对象的一个值更改其行为,该对象甚至被命名为_type,这表明了该目的。这确实是polymorphysm的一种情况,因为您可以使用不同的类来表示每种类型,而不是field _类型,这使得这样的switch语句变得不必要

但在你的例子中,这只是从一个值到另一个值的转换。 它不会改变整个对象的行为。
我可以考虑实现一些转换器,将条件逻辑移出查询体,但除此之外,代码还可以

但是参考页面上说,如果条件取决于类型,则使用多态性替换条件。这个条件取决于值,而不是类型,因此页面不适用。除非您计划将整个32位有符号整数集的英文ASCII表示嵌入到代码中,否则我会说这是一种非常糟糕的味道;想想未来,你的情况会发展到10或更多。因此,您的switch语句将增长太多,使linq看起来丑陋而复杂。如果您有一个函数来处理从数字到单词的转换,那么代码可能会更容易阅读。然后可以使用switch语句。我不确定编译器优化器是否会处理它,但它可能会产生更快、更紧凑的代码,而不是嵌套的条件。@zenwalker:那么,您是通过switch还是Linq实现条件逻辑,还是if else->所有这些实现错误?问题不在于林克。问题是,是否每次都将所有此类逻辑转换为某种形式的多态实现?这更多的是一个概念性的OO相关问题,而不是严格的实现特定问题。但这更多的是一个注释而不是答案。@RobertMS::但是,无论您是通过switch还是Linq实现条件逻辑,还是if else->所有这些逻辑都错了吗?问题不在于林克。问题是,是否每次都将所有此类逻辑转换为多态实现?这更多的是一个概念性的问题,而不是一个特定于实现的问题。@AngshumanAgarwal:我不认为有人会主张用某种多态性替换任何和所有条件。使用If或Swtich是可以的-但有时会有其他更好的方法来做事情,正如您在问题中的引用所指出的。。。。。你到底说了什么。。。这是什么样的答案?这是如何试图回答这个问题的?懒惰的需要很多improvement@Botz3000::但是,比方说,根据条件,如果您正在创建新的列表对象,该怎么办?实际上我对这些东西有点困惑。@AngshumanAgarwal我不明白你的意思。是否要将其指定给属性文本?或者返回一个列表作为结果的一部分?您链接到的文章并没有说必须用多态性替换所有条件语句。这只是一个很好的例子,当它可能适合使用多态性而不是条件。在像您的示例这样的查询中使用条件很好,并且没有代码气味。