欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解C♯ 7.0中的Tuple特性

 更新時(shí)間:2017年03月30日 09:45:24   作者:Tony  
這篇文章主要介紹了C#7中Tuple特性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

介紹

Tuple是異類(lèi)對(duì)象的有序序列。 我們經(jīng)??梢詫?xiě)出返回多個(gè)值的方法,所以我們需要?jiǎng)?chuàng)建一個(gè)包含多個(gè)數(shù)據(jù)元素的簡(jiǎn)單結(jié)構(gòu)。 為了支持這些情況,Tuple 被添加到 C#。 Tuple 是包含多個(gè)字段用來(lái)表示數(shù)據(jù)成員的輕量級(jí)數(shù)據(jù)結(jié)構(gòu)。

如果一個(gè)方法返回多個(gè)相同類(lèi)型的數(shù)值,那么它可以將這些值存儲(chǔ)在一個(gè)集合中并返回該集合。 但是如果一個(gè)方法需要返回多個(gè)不同類(lèi)型的值呢,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 的類(lèi),它實(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)的類(lèi)或結(jié)構(gòu)體。 我們?cè)谶@里也執(zhí)行相同的操作。 我們創(chuàng)建一個(gè)名為 CalculateData 的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體中有兩個(gè)屬性來(lái)保存一個(gè)系列的最大值和最小值。 以下代碼段就是用來(lái)創(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 的類(lèi),它用來(lái)實(shí)現(xiàn)從數(shù)字序列中查找最小值和最大值的方法。 以下代碼段就是用來(lái)實(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è)不同類(lèi)型的值。 要在應(yīng)用程序中使用 Tuple,我們需要安裝 System.ValueTuple NuGet 包.

圖3 NuGet 包

我們?cè)谶@里也執(zhí)行相同的操作。 讓我們創(chuàng)建一個(gè)名為 Operation 的類(lèi),它實(shí)現(xiàn)一個(gè)從數(shù)字系列中查找最小值和最大數(shù)的方法。 以下代碼段用來(lái)實(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 類(lèi)型,它們會(huì)按照他們的順序給它們一些默認(rèn)名稱(chēng),以便可以方便地調(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í)際名稱(chēng),因此我們可以給它們自定義名稱(chēng)。 元組類(lèi)型變量可以具有自定義名稱(chēng),而不是僅僅是默認(rèn)的 Item1 或 Item2。

讓我們更新 Operation 類(lèi)中名為 FindMinMax 的現(xiàn)有方法。 我們?yōu)檫@些元組字段分配自定義名稱(chēng)。 以下代碼段用來(lái)實(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è)字段名稱(chēng)為 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)目的順序稱(chēng)為最小值和最大值。

現(xiàn)在,運(yùn)行應(yīng)用程序并查看結(jié)果。

圖5 輸出結(jié)果

結(jié)論

Tuple 是異類(lèi)對(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é)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C# 單元測(cè)試全解析

    C# 單元測(cè)試全解析

    這篇文章主要介紹了C# 單元測(cè)試的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#繪制曲線(xiàn)圖的方法

    C#繪制曲線(xiàn)圖的方法

    這篇文章主要介紹了C#繪制曲線(xiàn)圖的方法,以完整實(shí)例形式較為詳細(xì)的分析了C#進(jìn)行曲線(xiàn)繪制的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • C#使用shell32獲取文件屬性的方法

    C#使用shell32獲取文件屬性的方法

    這篇文章主要介紹了C#使用shell32獲取文件屬性的方法,涉及C#通過(guò)shell32獲取文件屬性的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)希爾排序

    C#實(shí)現(xiàn)希爾排序

    這篇文章介紹了C#實(shí)現(xiàn)希爾排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#文件分割的方法

    C#文件分割的方法

    這篇文章主要介紹了C#文件分割的方法,針對(duì)小于等于64M文件和大于64M文件兩種情況分析了C#文件分割的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07
  • 分享C#中幾個(gè)可用的類(lèi)

    分享C#中幾個(gè)可用的類(lèi)

    這篇文章主要為大家分享了C#中幾個(gè)可用的類(lèi),并給出了幾個(gè)例子進(jìn)行講解,感興趣的小伙伴們可以參考一下
    2016-05-05
  • c# 通過(guò)wbemtest和WMI Code Cretor更加高效的訪(fǎng)問(wèn)WMI

    c# 通過(guò)wbemtest和WMI Code Cretor更加高效的訪(fǎng)問(wèn)WMI

    能找到這篇博客的,相信都是有操作WMI需求的了。本文將講述如何快速驗(yàn)證、并集成到C#來(lái)操作WMI。
    2021-05-05
  • Winform控件Picture實(shí)現(xiàn)圖片拖拽顯示效果

    Winform控件Picture實(shí)現(xiàn)圖片拖拽顯示效果

    這篇文章主要為大家詳細(xì)介紹了Winform控件Picture實(shí)現(xiàn)圖片拖拽顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C#運(yùn)算符重載用法實(shí)例分析

    C#運(yùn)算符重載用法實(shí)例分析

    這篇文章主要介紹了C#運(yùn)算符重載用法,實(shí)例分析了C#中運(yùn)算符重載的基本實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2015-07-07
  • C#動(dòng)態(tài)調(diào)整數(shù)組大小的方法

    C#動(dòng)態(tài)調(diào)整數(shù)組大小的方法

    這篇文章主要介紹了C#動(dòng)態(tài)調(diào)整數(shù)組大小的方法,涉及C#中靜態(tài)方法CreateInstance的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論