簡體   English   中英

C#/ LINQ / Select Case:這是代碼味道嗎?

[英]C#/LINQ/Select Case: Is this a code smell?

我有以下代碼 - >類似於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似乎是一個明顯的選擇。 可能是錯的?

您發布的文章是正確的,但該文章根本不適用於您的查詢示例。 條件語句確實有用。

在該示例中,整個方法(可能還有整個對象) 基於對象的單個值更改其行為 (甚至命名為_type ,其顯示了該目的)。 這確實是多態的情況,因為代替字段_type ,您可以使用不同的類來表示每種類型,從而不需要這樣的switch語句。

但在你的情況下,它只是從一個值到另一個值的轉換。
它不會改變整個對象的行為。
我可以考慮實現一些將條件邏輯移出查詢體的轉換器,否則,代碼就可以了。

有一個有趣的區別。 LINQ是一個允許您查詢集合的API(正如您在問題中所演示的那樣)。 開關(或其他條件)語句用於控制程序流。

當你有很多基於某種類型控制程序流的條件語句時,你所指的頁面正在討論重構代碼 - 在這種情況下,它表明你可能想用一些多態來替換所有條件。 所以在這種情況下會有代碼味道。 但是在LINQ語句中使用條件是可以的 - 可能有很多方法來構造你的LINQ - 有些方法比其他方法表現更好,有些方法比其他方法讀得更好,但我不會說在LINQ中使用條件是一種代碼味道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM