深入淺出 C# 4/e 第九章 心得分享


分類

建立時間: 2022年11月8日 19:50
更新時間: 2022年11月17日 07:47

心得

此心得包含第九章、附錄1 第九章(Github PDF)

這個章節在說 LINQ 與 lambda,LINQ 很像 SQL 查詢語法,它可以像 SQL 那樣查詢可列舉的型態,如果你使用過 Laravel 的 Collection 那你一定會感到熟悉,這章節有很多不錯的內容值得分享。

Linq

Linq 有兩種寫法,一種是像 SQL 查詢一樣,另一種是方法鏈

以下擷取書中片段程式

查詢語法

int[] values = new int[] { 0, 12, 44, 36, 92, 54, 13, 8 };
IEnumerable<int> result =
    from v in values
    where v < 37
    orderby -v
    select v;

方法鏈

int[] values = new int[] { 0, 12, 44, 36, 92, 54, 13, 8 };

var result = values.Where(v => v < 37).OrderBy(v => -v);

descending

在 LINQ 查詢時,使用 - 負號排序,會遞減排序,但閱讀上比較容易漏看,改用 descending 關鍵字可以比較好閱讀,它一樣是遞減排序。

以下擷取書中片段程式

負號遞減排序

IEnumerable<Comic> mostExpensive =
    from comic in Comic.Catalog
    where Comic.Prices[comic.Issue] > 500
    orderby -Comic.Prices[comic.Issue]
    select comic;

descending 遞減排序

IEnumerable<Comic> mostExpensive =
    from comic in Comic.Catalog
    where Comic.Prices[comic.Issue] > 500
    orderby Comic.Prices[comic.Issue] descending
    select comic;

descending 方法鏈

int[] values = new int[] { 0, 12, 44, 36, 92, 54, 13, 8 };
var result = values.Where(v => v < 37).OrderByDescending(v => -v);

陣列混合型態

寫強型別寫久了,以為 c# 陣列不能像弱型別一樣同時有 int 和 string,到寫這篇心得為止一直都是這麼認為,後來又是我大意了,原來只要用 object 就可以了

object[] one = new object[]
    {
        1,
        "one"
    };

var one = new object[]
    {
        1,
        "one"
    };

單元測試

單元測試,可以更仔細地檢查程式是否有異常,雖然實際上很少人願意寫單元測試,因為這會拉長開發時間,但如果專案越來越龐大或者越來越多人維護同一個專案,單元測試所節省除錯的時間很有可能超過寫單元測試的時間,所以建議還是瞭解一下比較好,這在軟體開發中算是大部分的人都知道的知識,如果你不知道的話可能會被認為是一個菜鳥。

三元運算子

這是一種很常見的條件運算子,在我還是初學者的時候,每次用到這個就覺得自己像神一樣哈哈…
常見用法如下
變數 = 條件 ? 真執行這裡 : 假執行這裡;

using System;

public class Program
{
    public static void Main()
    {
        var money = 1000;
        string result;

        if (money > 100)
        {
            result = "I'm rich.";
        }
        else
        {
            result = "I'm poor.";
        }
        Console.WriteLine(result); // I'm rich.

        money = 0;
        result = money > 100 ? "I'm rich." : "I'm poor.";
        Console.WriteLine(result); // I'm poor.
    }
}

lambda

lambda 拉姆達,我想多少人在其他程式早已有所耳聞,如果你有寫過 python 或者是 javascript 的話應該會看過這個概念,它是一種匿名函式,書中提到的 lambda 用法,有些我是第一次學到,我比較常用 lambda 在寫很短的方法、寫 callback 函式,不是脫口秀那個 call back,callback 是寫程式的一種技巧,關於 callback 以後我再另外寫一篇文章說明。

switch 運算式

switch 有陳述式和運算式兩種,在這裡只列出兩者的程式碼範例給大家看,詳細使用方法請閱讀書籍或者參考官方文件。

以下擷取書中片段程式,兩段程式都是相同意思。

switch 陳述式

var score = 0;

switch (card.Suit)
{
    case Suits.Spades:
        score = 6;
        break;
    case Suits.Hearts:
        score = 4;
        break;
    default:
        score = 2;
        break;
}

switch 運算式

var score = card.Suit switch
{
    Suits.Spades => 6,
    Suits.Hearts => 4,
    _ => 2,
};

Go Fish

最後這個練習,讓我對測試驅動有進一步的理解,以及感受到寫單元測試的好處,雖然這是一個很大的練習,每次完成一個部分就很有成就,但真的花了我不少時間,最後還有一個製作 UI 大挑戰,這次挑戰我放棄了,有興趣的讀者們可以挑戰看看!

結論

裡面還包含一些探討 IEnumerable 的部分,我沒有分享,因為水有點深,Linq 出現了很多我第一次看到的型態,尤其是有用 groupby 的更是複雜,我感覺這已經有點像進階的內容了,受益良多。

最後 Go Fish 練習是線上 PDF 文件,只有英文版,閱讀英文有一個好處就是在技術的用詞方面會比較清楚,像是 LINQ query syntax vs chained LINQ methods ,比起中文的 LINQ 查詢語法 VS LINQ 方法鏈,syntax method 這些單字讓我更有聯想到書中想表達的含義,但必須具備一定的英文閱讀程度,否則在理解意思上會比較吃力

參考

觀看次數: 467
c#lambdalinqtestunitvar查詢心得單元測試深入淺出
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!