Tuple 是個資料集,且每個 Item 可以是不同的資料型態。
我覺得它就是 class 的偷吃步阿!
像我這種有 class 命名障礙的人簡直是一大福音,如果使用的地方很少,一時之間也想不到合適的集合名稱,就是使用 Tuple 的時候啦!
我最常使用 Tuple 的情境為
- 方法回傳多個值,以 Tuple 取代 ref、out
- 傳遞多個參數至方法,改成傳 Tuple
- 欲建立的 class property 很少且有 class 命名障礙時
使用方法:
建立 Tuple & 取值
//建立Tuple
//方法一:使用Tuple建構子
var authorInfo = new Tuple<string, DateTime>("AMA", new DateTime(2022, 1, 1));
//方法二:使用Create方法
var authorInfo = Tuple.Create("AMA", new DateTime(2022,1,1));
//取Tuple值
Console.Write(authorInfo.Item1);//AMA
Console.Write(authorInfo.Item2);//2022/01/01
Tuple 提供的多載如下
- Tuple<T1>
- Tuple<T1,T2>
- Tuple<T1,T2,T3>
- Tuple<T1,T2,T3,T4>
- Tuple<T1,T2,T3,T4,T5>
- Tuple<T1,T2,T3,T4,T5,T6>
- Tuple<T1,T2,T3,T4,T5,T6,T7>
- Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>
比較特別的是超過第七個 Item 要用巢狀 Tuple
//建立Tuple
//方法一:使用Tuple建構子
var info = new Tuple<int, int, int, int, int, int, int, Tuple<int>>(1, 2, 3, 4, 5, 6, 7, new Tuple<int>(8));
//方法二:使用Create方法
var info = Tuple.Create(1, 2,3,4,5,6,7,Tuple.Create(8));
//第8個用Rest取值
Console.WriteLine(info.Item1);//1
Console.WriteLine(info.Item2);//2
Console.WriteLine(info.Item3);//3
Console.WriteLine(info.Item4);//4
Console.WriteLine(info.Item5);//5
Console.WriteLine(info.Item6);//6
Console.WriteLine(info.Item7);//7
Console.WriteLine(info.Rest.Item1);//8
要注意 Tuple 的 Item 是唯讀的(沒有 setter),建立之後無法再更改值。
var authorInfo = Tuple.Create("AMA", new DateTime(2022, 1, 1));
authorInfo.Item1 = "FakeAMA";//這樣是錯誤的
參考資料:
https://learn.microsoft.com/zh-tw/dotnet/api/system.tuple?view=net-7.0