1

我有以下代码 - >类似于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"
        )
    }
);

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

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

4

2 回答 2

2

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

在示例中,整个方法(可能还有整个对象)根据对象的一个​​值(甚至命名为_type,这表明了该目的)改变了它的行为。这确实是多态性的一种情况,因为_type你可以用不同的类来代表每种类型,而不是 field ,这样就不需要这样的 switch 语句。

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

于 2012-06-06T14:55:02.667 回答
1

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

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

于 2012-06-06T14:46:23.367 回答