深入理解C♯ 7.0中的Tuple特性
介紹
Tuple是異類對(duì)象的有序序列。 我們經(jīng)??梢詫懗龇祷囟鄠€(gè)值的方法,所以我們需要?jiǎng)?chuàng)建一個(gè)包含多個(gè)數(shù)據(jù)元素的簡單結(jié)構(gòu)。 為了支持這些情況,Tuple 被添加到 C#。 Tuple 是包含多個(gè)字段用來表示數(shù)據(jù)成員的輕量級(jí)數(shù)據(jù)結(jié)構(gòu)。
如果一個(gè)方法返回多個(gè)相同類型的數(shù)值,那么它可以將這些值存儲(chǔ)在一個(gè)集合中并返回該集合。 但是如果一個(gè)方法需要返回多個(gè)不同類型的值呢,C# 提供了一些可選項(xiàng),比如 Class / Struct,輸出參數(shù)和 Tuple。
讓我們創(chuàng)建一個(gè)示例。 我們有一個(gè)整數(shù)的集合,而且我們需要從這個(gè)集合中找出的最小值和最大值。 這時(shí)候我們需要?jiǎng)?chuàng)建一個(gè)返回最小值和最大值的方法。 為了實(shí)現(xiàn)這一點(diǎn),我們有三個(gè)選項(xiàng):Class / Struct,輸出參數(shù)和 Tuple。 那么,讓我們逐個(gè)看看每個(gè)選項(xiàng)是如何完成這一功能的。
使用 out 參數(shù)
當(dāng)我們創(chuàng)建一個(gè)方法,找出數(shù)字序列中的最大值和最小值。 該方法需要將兩個(gè)值作為最大值和最小值的結(jié)果。 因此,我們創(chuàng)建返回值和使用 out 參數(shù)作為參數(shù)的方法。 返回值保存系列中的最大數(shù),而 out 參數(shù)保存系列中的最小數(shù)。
讓我們創(chuàng)建一個(gè)名為 Operation 的類,它實(shí)現(xiàn)一個(gè)從數(shù)字系列中查找最小和最大數(shù)的方法。 以下代碼段就能實(shí)現(xiàn)該功能。
using System.Collections.Generic; namespace TupleApp { class Operation { internal int FindMinMax(List<int> list, out int min) { int maximum = int.MinValue, minimum = int.MaxValue; list.ForEach(n => { minimum = n < minimum ? n : minimum; maximum = n > maximum ? n : maximum; }); min = minimum; return maximum; } } }
根據(jù)上述代碼片段,該方法返回一個(gè)值,該值保存一個(gè)名為 maximum 的整形變量。 該值是該系列的最大值。 此方法將輸出參數(shù)是名為 min 的參數(shù),該參數(shù)保存的是系列中的最小值。
現(xiàn)在,根據(jù)下面的代碼片段從可執(zhí)行程序調(diào)用此方法。
using System; using System.Collections.Generic; using System.Linq; using static System.Console; namespace TupleApp { class Program { static void Main(string[] args) { List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList(); int minimum = 0, maximum = 0; Operation operation = new Operation(); maximum = operation.FindMinMax(numbers, out minimum); Write($"{minimum} is min and {maximum} is max in {String.Join(",", numbers)}"); Read(); } } }
現(xiàn)在,運(yùn)行應(yīng)用程序。 結(jié)果如下圖所示。
圖1:輸出
這是正確的方法,但 out 參數(shù)并不適合于異步方法。
使用 Class/Struct
還有另一個(gè)選項(xiàng)可以從一個(gè)方法獲取多個(gè)值–創(chuàng)建一個(gè)具有該數(shù)據(jù)結(jié)構(gòu)的類或結(jié)構(gòu)體。 我們?cè)谶@里也執(zhí)行相同的操作。 我們創(chuàng)建一個(gè)名為 CalculateData 的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體中有兩個(gè)屬性來保存一個(gè)系列的最大值和最小值。 以下代碼段就是用來創(chuàng)建這個(gè)結(jié)構(gòu)體。
namespace TupleApp { struct CalculateData { public int Minimum { get; set; } public int Maximum { get; set; } } }
現(xiàn)在,讓我們創(chuàng)建另一個(gè)名為 Operation 的類,它用來實(shí)現(xiàn)從數(shù)字序列中查找最小值和最大值的方法。 以下代碼段就是用來實(shí)現(xiàn)這一功能。
using System.Collections.Generic; namespace TupleApp { class Operation { internal CalculateData FindMinMax(List<int> list) { int maximum = int.MinValue, minimum = int.MaxValue; list.ForEach(n => { minimum = n < minimum ? n : minimum; maximum = n > maximum ? n : maximum; }); CalculateData data = new CalculateData { Minimum = minimum, Maximum = maximum }; return data; } } }
根據(jù)上面的代碼片段,該方法返回一個(gè)具有兩個(gè)屬性的對(duì)象。 這些屬性里保存的是系列中的最大值和最小值。
現(xiàn)在,從可執(zhí)行程序調(diào)用此方法,如下面的代碼片段所示。
using System; using System.Collections.Generic; using System.Linq; using static System.Console; namespace TupleApp { class Program { static void Main(string[] args) { List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList(); Operation operation = new Operation(); CalculateData data = operation.FindMinMax(numbers); Write($"{data.Minimum} is min and {data.Maximum} is max in {String.Join(",", numbers)}"); Read(); } } }
現(xiàn)在,運(yùn)行應(yīng)用程序。 最終結(jié)果如下圖所示。
圖2: 輸出結(jié)果
使用 Tuple
C#7 引入了定義元組的新方法。 Tuple 是從方法返回多個(gè)值的另一個(gè)選擇。 它可以保存多個(gè)不同類型的值。 要在應(yīng)用程序中使用 Tuple,我們需要安裝 System.ValueTuple NuGet 包.
圖3 NuGet 包
我們?cè)谶@里也執(zhí)行相同的操作。 讓我們創(chuàng)建一個(gè)名為 Operation 的類,它實(shí)現(xiàn)一個(gè)從數(shù)字系列中查找最小值和最大數(shù)的方法。 以下代碼段用來實(shí)現(xiàn)該功能。
using System.Collections.Generic; namespace TupleApp { class Operation { internal (int, int) FindMinMax(List<int> list) { int maximum = int.MinValue, minimum = int.MaxValue; list.ForEach(n => { minimum = n < minimum ? n : minimum; maximum = n > maximum ? n : maximum; }); return (minimum, maximum); } } }
根據(jù)上面的代碼片段,該方法返回一個(gè)有兩個(gè)項(xiàng)目的元組。 這些項(xiàng)目保存數(shù)字系列的最大值和最小值。
現(xiàn)在,根據(jù)下面的代碼片段在可執(zhí)行程序調(diào)用這個(gè)方法。
using System; using System.Collections.Generic; using System.Linq; using static System.Console; namespace TupleApp { class Program { static void Main(string[] args) { List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList(); Operation operation = new Operation(); (int, int) data = operation.FindMinMax(numbers); Write($"{data.Item1} is min and {data.Item2} is max from {String.Join(",", numbers)}"); Read(); } } }
根據(jù)上面的代碼片段,名為 FindMinMax 的方法調(diào)用并返回一個(gè)元組。 當(dāng)方法直接返回多個(gè)值到一個(gè) Tuple 類型,它們會(huì)按照他們的順序給它們一些默認(rèn)名稱,以便可以方便地調(diào)用它們。這元組有兩個(gè)項(xiàng)目,因此這些項(xiàng)目調(diào)用 Item1 和 Item2。 Item1 表示第一個(gè)值,而 Item2 表示第二個(gè)值。這跟 Tupple 項(xiàng)在創(chuàng)建時(shí)使用的順序相同。
現(xiàn)在,運(yùn)行應(yīng)用程序。 最終結(jié)果如下圖所示。
圖4 輸出結(jié)果
由于 Item1 和 Item2 不表示字段的實(shí)際名稱,因此我們可以給它們自定義名稱。 元組類型變量可以具有自定義名稱,而不是僅僅是默認(rèn)的 Item1 或 Item2。
讓我們更新 Operation 類中名為 FindMinMax 的現(xiàn)有方法。 我們?yōu)檫@些元組字段分配自定義名稱。 以下代碼段用來實(shí)現(xiàn)該功能。
using System.Collections.Generic; namespace TupleApp { class Operation { internal (int Minimum, int Maximum) FindMinMax(List<int> list) { int maximum = int.MinValue, minimum = int.MaxValue; list.ForEach(n => { minimum = n < minimum ? n : minimum; maximum = n > maximum ? n : maximum; }); return (minimum, maximum); } } }
這里,元組的第一個(gè)字段名稱為 Minimum,而另一個(gè)字段名為 Maximum。
現(xiàn)在,根據(jù)下面的代碼片段從可執(zhí)行程序調(diào)用此方法。
using System; using System.Collections.Generic; using System.Linq; using static System.Console; namespace TupleApp { class Program { static void Main(string[] args) { List<int> numbers = Enumerable.Range(1, 100).OrderBy(x => Guid.NewGuid()).Take(10).ToList(); Operation operation = new Operation(); var data = operation.FindMinMax(numbers); Write($"{data.Minimum} is min and {data.Maximum} is max from {String.Join(",", numbers)}"); Read(); } } }
名為 FindMinMax 的方法調(diào)用并返回一個(gè)元組。 該元組有兩個(gè)項(xiàng)目,根據(jù)元組項(xiàng)目的順序稱為最小值和最大值。
現(xiàn)在,運(yùn)行應(yīng)用程序并查看結(jié)果。
圖5 輸出結(jié)果
結(jié)論
Tuple 是異類對(duì)象的有序序列。 當(dāng)一個(gè)方法需要返回多個(gè)值的時(shí)候使用它。Tuple 實(shí)例的條目數(shù)是固定的。Tuple 有最大數(shù)目為 8 項(xiàng)的限制。 如果我們想創(chuàng)建一個(gè)帶有更多項(xiàng)的 Tuple,我們必須創(chuàng)建嵌套的 Tuple。 Tuple 的第八項(xiàng)必須是另一個(gè) Tuple。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:C# 讀寫XML(代碼分享)
欄 目:C#教程
下一篇:C#給PDF文件添加水印
本文標(biāo)題:深入理解C&#9839; 7.0中的Tuple特性
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5819.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10深入解析C#編程中struct所定義的結(jié)構(gòu)
- 01-10深入解析C#中的交錯(cuò)數(shù)組與隱式類型的數(shù)組
- 01-10理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類引用的區(qū)別
- 01-10理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類
- 01-10深入解析C#中的abstract抽象類
- 01-10深入講解C#編程中嵌套類型和匿名類型的定義與使用
- 01-10深入解析C#中的泛型類與泛型接口
- 01-10深入解析C#中的命名實(shí)參和可選實(shí)參
- 01-10深入解析C#編程中泛型委托的使用


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)