Tuple in C#

  • 8997
  • 0

雖然Tuple 類別對其他語言來說不是新的東西,但對於C# 卻是一位新成員

雖然Tuple 類別對其他語言來說不是新的東西,但對於C# 卻是一位新成員,不過運作的觀念與其他語言大致相同

MSDN說法:Tuple 是一種資料結構,包含特定數目和順序的值,直接用個範例來看就知道了

 

		static void Main() {
			//人員姓名,身高,體重
			Tuple<string, double, double> people = new Tuple<string, double, double>("小叮噹", 100, 80);
			Console.WriteLine("我的名字是 {0}, 身高 : {1} cm, 體重: {2} kg", people.Item1, people.Item2, people.Item3);
			Console.Read();
		}

結果

其中people的Item1, Item2....,依序代表Tuple 的中存放的值

不過對於Tuple比較常在一個Function 要回傳多個資訊,以往的作法可能是設定 ref 或是out 的參數,不然就是回傳個特定class,例如下面範例是判斷一個人的BMI直過小於25,就算健康,且提供message

 

		static bool IsHealthy(double height, double weight, out string message) {
			double bmi = weight / Math.Pow(height / 100, 2);
			if (bmi < 25) {
				message = "標準身材";
				return true;
			} else {
				message = "該減肥了";
				return false;
			}
		}

如今可已改成

 

		static Tuple<bool, string> IsHealthy2(double height, double weight) {
			double bmi = weight / Math.Pow(height / 100, 2);
			Tuple<bool, string> t;

			if (bmi < 25) {
				t = Tuple.Create<bool, string>(true, "標準身材");
			} else {
				t = Tuple.Create<bool, string>(false, "該減肥了");
			}
			return t;
		}

 

這麼做就不需要out 或ref 的參數,也不需要建立一個class來回傳多個資訊,但缺點是語意的不明,畢竟 用Item1, Item2, Item3.....,是容易讓人搞不清楚,尤其是日後review這些code 時。

另外Tuple  也可以達到KeyValuePair的效果,需注意的是,Tuple 的Property 是唯讀的(Item1, Item2......),一旦建立之後就不可修改