C# Tuple

2023-01-21

筆記如何使用 C# Tuple 管理物件資料。

logo

說明

C# 的 Tuple 有兩種,一種是在 C# 4.0 出現的 System.Tuple;另一種則是在 C# 7.0 所出現的 System.ValueTuple

項目 System.Tuple System.ValueTuple
Type Reference Type Value Type
Mutable 不可變 (immutable) 可變的 (mutable)
Class Data Property Field

Tuple

var tp = new Tuple<string, int>("Hello", 1024);
Console.WriteLine($"{tp.Item1} {tp.Item2}");

var tp2 = Tuple.Create("Hello", 1024);
Console.WriteLine($"{tp2.Item1} {tp2.Item2}");

因為 Tuple 是 immutable,因此無法改變 Item 的值。

vtp.Item1 = "Hello World"; // ❌

Value Tuple

(string, string) vtp = ("Hello", 1024);
Console.WriteLine($"{vtp.Item1}, {vtp.Item2}");

Value Tuple 是 mutable,所以可以改變 Item 的值。

vtp.Item1 = "Hello World"; // ✔️

另可以指定 Value Tuple Property 名稱的使用方式,用起來很像 Python 的 Named Tuple,但 C# 寫法上更為簡便 (C# ❤️)

var vtp2 = (greeting: "Hello", versions: 1024);
Console.WriteLine($"{vtp2.greeting}, {vtp2.versions}");

TupleExtensions

如果想要將 Value Tuple 以及 Tuple 互相轉換,可以使用 Static Class TupleExtensions 來進行。

var vtp = TupleExtensions.ToValueTuple(Tuple.Create("Hello", 1024, 0.31415926));
vtp.GetType(); 
// System.ValueTuple`3[System.String,System.Int32,System.Double]

var tp = TupleExtensions.ToTuple(("Hello", 1024, 0.31415926));
tp.GetType(); 
// System.Tuple`3[System.String,System.Int32,System.Double]

或者是直接在 Value Tuple 以及 Tuple 的物件上使用 Extension Methods。

參考資料

System.ValueTuple | learn.microsoft

System.Tuple | learn.microsoft

重新認識 C# [7] - C# 7 ValueTuple | 黑暗執行緒