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

本文关键字:代码 LINQ Select Case | 更新日期: 2023-09-27 18:36:31

我有以下代码 ->类似Select case using LINQ -这不是[从互联网上挑选的]实际代码。只是尝试使用 LINQ 显示选择大小写概念。在我的代码中,根据条件创建新的 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"
        )
    }
);

但是,这里的页面说 - "用多态性替换条件"。

所以,问题是这种实现是否是一种代码气味,是否应该始终严格避免?在循环访问集合并有条件地创建新对象时,LINQ 似乎是一个显而易见的选择。可能是错的?

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

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

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

但在您的情况下,这只是从一个值到另一个值的转换。
它不会更改整个对象的行为。
我可以考虑实现一些转换器,将条件逻辑移出查询正文,但除此之外,代码很好。

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

您所指的页面正在谈论重构代码,当您有很多条件语句基于某种类型控制程序流时 - 在这种情况下,它表明您可能希望用一些多态性替换所有条件。所以在这种情况下,有一种代码气味。但是在 LINQ 语句中使用条件是可以的 - 可能有很多方法可以构建 LINQ - 有些方法的性能比其他方法更好,有些方法的阅读效果更好,但我不会说在 LINQ 中使用条件是一种代码异味。