昨天大概介紹了record的功能,今天來介紹一下可以怎麼使用。
假設今天有一個csv格式的資料,我想要把他整理成容易使用的方式
var csv = @"姓名,角色,身份
洛伊德,爸爸,間諜
約兒,媽媽,殺手
安妮亞,女兒,讀心能力者
彭德,寵物,預知能力者";
var data = csv.Replace("\t","") // 1
.Split("\n"). // 2
.Select(x=> x.Split(",")) // 3
.Skip(1); // 4
第一步的時候不會改變原來csv的文字,而是生成一個新的沒有tab的字串。而第二部將字串分割生成一個集合,第三步進一步把集合中的元素切割,第四步則是去掉第一行的欄位名稱,只留下我們需要的資料,畫成圖如下
作為資料處理流程中的每一步,都衍生自上一步的資料。
假設今天有一張考卷,裡面總共有五題,我們要設計一個程式檢查答案,每答對一題就能夠拿到20分:
record Exam(
string Problem1,
string Problem2,
string Problem3,
string Problem4,
string Problem5,
int Score);
var exam = new Exam("答對","答對","答對","答對","答對",0);
var score = Grade(
exam,
ScoreProblem1,
ScoreProblem2,
ScoreProblem3,
ScoreProblem4,
ScoreProblem5)
.Select(x => x.Score)
.Sum();
// score = 100 恭喜滿分
IEnumerable<Exam> Grade(Exam e, params Func<Exam,Exam>[] score)
=> score.Select(f=> f(e));
// 只要寫"答對"就給分
Exam ScoreProblem1(Exam exam)
=> exam.Problem1 == "答對"
? exam with { Score = 20 }
: exam;
// 下略
原本是想要寫成第一題改完再改第二題,透過with可以輕易的建立新的紀錄,這樣就可以看到整張考卷從0分開始一步步加到100分,而record就是改考卷的每個時間點的分數。
record 就是一組有欄位(名稱)的資料:
https://en.wikipedia.org/wiki/Record_(computer_science)
Haskell 裡也是使用 record 作為關鍵字:
https://openhome.cc/zh-tw/haskell/algebraic-data-type/record/
Java 也是用 record 關鍵字:
https://openhome.cc/zh-tw/java/encapsulation/record/
Python 裡是用 @dataclass,C、Go 的話是用 struct 等…