首頁>技術>

開局一張圖,首先宣告的是 Tuple 不是什麼新鮮概念,在程式語言 F#,Python 中早就有這個了,Tuple 是一種 有序的,有限不可變的,支援混雜型別的固定個數的 一種資料結構,有些朋友可能就想問了,這裡的混雜是什麼意思? 其實就是說 Tuple 中的若干元素型別,即可以是同類型,也可以是不同型別。

值得注意的是,Tuple 中的元素是 只讀的,而且其元素的順序也是在 Tuple 建立的時候指定好的,不能對其中的元素進行後續修改 也不能修改 Tuple 的大小。

為什麼要使用 Tuple

下面羅列了幾種使用 Tuple 的場景:

如果你的方法需要返回多個值 或者 方法需要傳遞多個值。

如果你不想為某些功能專門去定義一個類。

如果你有若干個混雜元素,並且想提供對其簡單的訪問方式。

上面三種情況都是 Tuple 最擅長的應用場景,值得用 Tuple 去解決。

有些朋友可能會想到 匿名類,但仔細想想, 匿名類 也有其缺陷,比如說方法的返回值是不可能指定為匿名型別的,對吧。

當然 Tuple 也是有缺陷的,羅列如下:

當你訪問 Tuple 中的元素時,你會發現只能使用 Item1, Item2, Item3 這樣的形式,很顯然這種太不易讀了,而且一旦 Tuple 中的元素過多,維護起來也是一種負擔。

Tuple 是引用型別不是值型別,意味著它會在 託管堆 上進行記憶體分配,如果 Tuple 過大並且沒有很好的釋放,對程式也是一個不小的效能挑戰。

C# 中使用 Tuple

叨叨叨的說了這麼多,接下來看看如何使用,在 C# 中提供了一個 Tuple 類,這個類下有一個靜態方法 Create 可用來生成 Tuple 例項,順便提一下,這個 Create 方法提供了 8 個過載方法,下面展示了這些方法簽名清單。

public static class Tuple{    public static Tuple<T1> Create<T1>(T1 item1)    {        return new Tuple<T1>(item1);    }    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)    {        return new Tuple<T1, T2>(item1, item2);    }    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)    {        return new Tuple<T1, T2, T3>(item1, item2, item3);    }    public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)    {        return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);    }    public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)    {        return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);    }    public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)    {        return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);    }    public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)    {        return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);    }    public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)    {        return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));    }}

接下來看看如何建立和初始化 Tuple。

            var listEmployee = new List<Tuple<int, string, string>>            {              Tuple.Create(1, "Joydip Kanjilal", "INDIA"),              Tuple.Create(2, "Michael Stevens", "USA" ),              Tuple.Create(3, "Steve Barnes", "USA" )            };

一旦你的 Tuple 建立並初始化好,你可以像迭代其他集合一樣迭代 Tuple,下面的程式碼清單展示瞭如何去實現。

            foreach (Tuple<int, string, string> tuple in listEmployee)            {                Console.WriteLine(tuple.Item2);            }

下面是完整的程式碼清單展示瞭如何去 建立,初始化,迭代。

        static void Main(string[] args)        {            var listEmployee = new List<Tuple<int, string, string>>            {                Tuple.Create(1, "Joydip Kanjilal", "INDIA"),                Tuple.Create(2, "Michael Stevens", "USA" ),                Tuple.Create(3, "Steve Barnes", "USA" )            };            foreach (Tuple<int, string, string> tuple in listEmployee)            {                Console.WriteLine(tuple.Item2);            }            Console.Read();        }

你也可以建立 巢狀的 Tuple,如下程式碼所示:

13
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • ES6新增了加強版的var,究竟有什麼區別呢?