Tuple<T>類是在 .NET Framework4.0 中引入的。元組是一種包含不同數(shù)據(jù)類型的元素序列的數(shù)據(jù)結(jié)構(gòu)。它可以用于需要數(shù)據(jù)結(jié)構(gòu)來保存具有屬性的對(duì)象,但又不想為其創(chuàng)建單獨(dú)類型的情況。
語法:
Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>
下面的示例創(chuàng)建一個(gè)包含三個(gè)元素的元組:
Tuple<int, string, string> person = new Tuple <int, string, string>(1, "Steve", "Jobs");
在上面的示例中,我們創(chuàng)建了一個(gè)Tuple包含一個(gè)人的記錄的實(shí)例。我們?yōu)槊總€(gè)元素指定一種類型,并將值傳遞給構(gòu)造函數(shù)。指定每個(gè)元素的類型很麻煩。C#引入了一個(gè)靜態(tài)幫助器類Tuple,,該類返回Tuple <T>的實(shí)例,而不必指定每個(gè)元素的類型,如下所示。
var person = Tuple.Create(1, "Steve", "Jobs");
一個(gè)元組最多只能包含八個(gè)元素。當(dāng)您嘗試包含八個(gè)以上的元素時(shí),它將產(chǎn)生編譯器錯(cuò)誤。
var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
元組元素可以通過 Item < elementnumber > 屬性訪問,例如 Item1、 Item2、 Item3等,最多可以訪問 Item7屬性。Item1屬性返回第一個(gè)元素,Item2返回第二個(gè)元素,依此類推。最后一個(gè)元素(第8個(gè)元素)將使用 Rest 屬性返回。
var person = Tuple.Create(1, "Steve", "Jobs"); person.Item1; // 返回 1 person.Item2; // 返回 "Steve" person.Item3; // 返回 "Jobs" var numbers = Tuple.Create("One", 2, 3, "Four", 5, "Six", 7, 8); numbers.Item1; // 返回 "One" numbers.Item2; // 返回 2 numbers.Item3; // 返回 3 numbers.Item4; // 返回 "Four" numbers.Item5; // 返回 5 numbers.Item6; // 返回 "Six" numbers.Item7; // 返回 7 numbers.Rest; // 返回 (8) numbers.Rest.Item1; // 返回 8
通常,第8個(gè)位置用于嵌套元組,您可以使用Rest屬性訪問該位置。
如果要在一個(gè)元組中包含八個(gè)以上的元素,則可以通過嵌套另一個(gè)元組對(duì)象作為第八個(gè)元素來實(shí)現(xiàn)??梢允褂肦est屬性訪問最后一個(gè)嵌套元組。要訪問嵌套元組的元素,請(qǐng)使用Rest.Item1.Item<elelementNumber>屬性。
var numbers = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9, 10, 11, 12, 13)); numbers.Item1; // 返回 1 numbers.Item7; // 返回 7 numbers.Rest.Item1; //返回(8,9,10,11,12,13) numbers.Rest.Item1.Item1; //返回 8 numbers.Rest.Item1.Item2; //返回 9
您可以在序列中的任何位置包括嵌套元組對(duì)象。但是,建議將嵌套的元組放在序列的末尾,以便可以使用Rest屬性訪問它。
var numbers = Tuple.Create(1, 2, Tuple.Create(3, 4, 5, 6, 7, 8), 9, 10, 11, 12, 13 ); numbers.Item1; // 返回 1 numbers.Item2; // 返回 2 numbers.Item3; // 返回 (3, 4, 5, 6, 7, 8) numbers.Item3.Item1; // 返回 3 numbers.Item4; // 返回 9 numbers.Rest.Item1; //返回13
方法可以將元組作為參數(shù)。
static void Main(string[] args) { var person = Tuple.Create(1, "Steve", "Jobs"); DisplayTuple(person); } static void DisplayTuple(Tuple<int,string,string> person) { Console.WriteLine($"Id = { person.Item1}"); Console.WriteLine($"First Name = { person.Item2}"); Console.WriteLine($"Last Name = { person.Item3}"); }
元組可以從方法返回。
static void Main(string[] args) { var person = GetPerson(); } static Tuple<int, string, string> GetPerson() { return Tuple.Create(1, "Bill", "Gates"); }
元組可以在以下情況下使用:
當(dāng)您想從一個(gè)方法中返回多個(gè)值而不使用ref 或 out參數(shù)時(shí)。
當(dāng)您想通過單個(gè)參數(shù)將多個(gè)值傳遞給方法時(shí)。
當(dāng)您想暫時(shí)保存數(shù)據(jù)庫記錄或某些值而不創(chuàng)建單獨(dú)的類時(shí)。。
Tuple是一個(gè)引用類型,而不是一個(gè)值類型。它在堆上分配,并可能導(dǎo)致CPU密集型操作。
Tuple被限制為包括八個(gè)元素。如果需要存儲(chǔ)更多元素,則需要使用嵌套元組。但是,這可能導(dǎo)致歧義。
可以使用名稱模式 Item <elementNumber> 的屬性訪問Tuple元素,這是不太合理的。
C#7引入了ValueTuple以克服Tuple的局限性,并使使用Tuple的工作更加輕松。在下一章中了解它。