深入理解C♯ 7.0中的Tuple特性
介紹
Tuple是異類對象的有序序列。 我們經(jīng)常可以寫出返回多個值的方法,所以我們需要創(chuàng)建一個包含多個數(shù)據(jù)元素的簡單結(jié)構(gòu)。 為了支持這些情況,Tuple 被添加到 C#。 Tuple 是包含多個字段用來表示數(shù)據(jù)成員的輕量級數(shù)據(jù)結(jié)構(gòu)。
如果一個方法返回多個相同類型的數(shù)值,那么它可以將這些值存儲在一個集合中并返回該集合。 但是如果一個方法需要返回多個不同類型的值呢,C# 提供了一些可選項,比如 Class / Struct,輸出參數(shù)和 Tuple。
讓我們創(chuàng)建一個示例。 我們有一個整數(shù)的集合,而且我們需要從這個集合中找出的最小值和最大值。 這時候我們需要創(chuàng)建一個返回最小值和最大值的方法。 為了實現(xiàn)這一點,我們有三個選項:Class / Struct,輸出參數(shù)和 Tuple。 那么,讓我們逐個看看每個選項是如何完成這一功能的。
使用 out 參數(shù)
當(dāng)我們創(chuàng)建一個方法,找出數(shù)字序列中的最大值和最小值。 該方法需要將兩個值作為最大值和最小值的結(jié)果。 因此,我們創(chuàng)建返回值和使用 out 參數(shù)作為參數(shù)的方法。 返回值保存系列中的最大數(shù),而 out 參數(shù)保存系列中的最小數(shù)。
讓我們創(chuàng)建一個名為 Operation 的類,它實現(xiàn)一個從數(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ù)上述代碼片段,該方法返回一個值,該值保存一個名為 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īng)用程序。 結(jié)果如下圖所示。

圖1:輸出
這是正確的方法,但 out 參數(shù)并不適合于異步方法。
使用 Class/Struct
還有另一個選項可以從一個方法獲取多個值–創(chuàng)建一個具有該數(shù)據(jù)結(jié)構(gòu)的類或結(jié)構(gòu)體。 我們在這里也執(zhí)行相同的操作。 我們創(chuàng)建一個名為 CalculateData 的結(jié)構(gòu)體,這個結(jié)構(gòu)體中有兩個屬性來保存一個系列的最大值和最小值。 以下代碼段就是用來創(chuàng)建這個結(jié)構(gòu)體。
namespace TupleApp
{
struct CalculateData
{
public int Minimum { get; set; }
public int Maximum { get; set; }
}
}
現(xiàn)在,讓我們創(chuàng)建另一個名為 Operation 的類,它用來實現(xiàn)從數(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ù)上面的代碼片段,該方法返回一個具有兩個屬性的對象。 這些屬性里保存的是系列中的最大值和最小值。
現(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īng)用程序。 最終結(jié)果如下圖所示。

圖2: 輸出結(jié)果
使用 Tuple
C#7 引入了定義元組的新方法。 Tuple 是從方法返回多個值的另一個選擇。 它可以保存多個不同類型的值。 要在應(yīng)用程序中使用 Tuple,我們需要安裝 System.ValueTuple NuGet 包.

圖3 NuGet 包
我們在這里也執(zhí)行相同的操作。 讓我們創(chuàng)建一個名為 Operation 的類,它實現(xiàn)一個從數(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ù)上面的代碼片段,該方法返回一個有兩個項目的元組。 這些項目保存數(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();
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)用并返回一個元組。 當(dāng)方法直接返回多個值到一個 Tuple 類型,它們會按照他們的順序給它們一些默認(rèn)名稱,以便可以方便地調(diào)用它們。這元組有兩個項目,因此這些項目調(diào)用 Item1 和 Item2。 Item1 表示第一個值,而 Item2 表示第二個值。這跟 Tupple 項在創(chuàng)建時使用的順序相同。
現(xiàn)在,運行應(yīng)用程序。 最終結(jié)果如下圖所示。

圖4 輸出結(jié)果
由于 Item1 和 Item2 不表示字段的實際名稱,因此我們可以給它們自定義名稱。 元組類型變量可以具有自定義名稱,而不是僅僅是默認(rèn)的 Item1 或 Item2。
讓我們更新 Operation 類中名為 FindMinMax 的現(xiàn)有方法。 我們?yōu)檫@些元組字段分配自定義名稱。 以下代碼段用來實現(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);
}
}
}
這里,元組的第一個字段名稱為 Minimum,而另一個字段名為 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)用并返回一個元組。 該元組有兩個項目,根據(jù)元組項目的順序稱為最小值和最大值。
現(xiàn)在,運行應(yīng)用程序并查看結(jié)果。

圖5 輸出結(jié)果
結(jié)論
Tuple 是異類對象的有序序列。 當(dāng)一個方法需要返回多個值的時候使用它。Tuple 實例的條目數(shù)是固定的。Tuple 有最大數(shù)目為 8 項的限制。 如果我們想創(chuàng)建一個帶有更多項的 Tuple,我們必須創(chuàng)建嵌套的 Tuple。 Tuple 的第八項必須是另一個 Tuple。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
c# 通過wbemtest和WMI Code Cretor更加高效的訪問WMI
能找到這篇博客的,相信都是有操作WMI需求的了。本文將講述如何快速驗證、并集成到C#來操作WMI。2021-05-05
Winform控件Picture實現(xiàn)圖片拖拽顯示效果
這篇文章主要為大家詳細介紹了Winform控件Picture實現(xiàn)圖片拖拽顯示效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09

