iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

昨天大概介紹了record的功能,今天來介紹一下可以怎麼使用。

觀察資料流程

假設今天有一個csv格式的資料,我想要把他整理成容易使用的方式

var csv = @"姓名,角色,身份
            洛伊德,爸爸,間諜
			約兒,媽媽,殺手
            安妮亞,女兒,讀心能力者
            彭德,寵物,預知能力者";

var data = csv.Replace("\t","")          // 1
              .Split("\n").              // 2
		      .Select(x=> x.Split(","))  // 3
		   	  .Skip(1);                  // 4

第一步的時候不會改變原來csv的文字,而是生成一個新的沒有tab的字串。而第二部將字串分割生成一個集合,第三步進一步把集合中的元素切割,第四步則是去掉第一行的欄位名稱,只留下我們需要的資料,畫成圖如下

https://ithelp.ithome.com.tw/upload/images/20220923/20148594Q7g9Fa1LIC.png

作為資料處理流程中的每一步,都衍生自上一步的資料。

with Record

假設今天有一張考卷,裡面總共有五題,我們要設計一個程式檢查答案,每答對一題就能夠拿到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就是改考卷的每個時間點的分數。


上一篇
Day11. Record(1)
下一篇
Day13. Pure Function
系列文
Functional Programming with C#30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
良葛格
iT邦新手 2 級 ‧ 2022-09-24 18:02:15

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 等…

我要留言

立即登入留言