C#中的元组对象Tuple

一、什么是元组

元组就是一些对象的集合,在我们编程时,比如一个人的信息,我们常常创建一个Person类去描述一个人,传统的做法如下:

public class Person{ 
 public int ID{get;set;} 
 public string Name{get;set;}
}
Person a=new Person(){ID=1001,Name='CodeL'};
Console.WriteLine(a.Name);

那么我们使用元组可以怎么做呢?如下所示

Tuple<int,string> a=new Tuple<int,string>(1001,'CodeL');    //直接使用元组对象,不需要创建自定义的对象

Console.WriteLine(a.Item2);//Item1 代表第一个,Item2代表第二个,每一个元组对象都有一个默认的item属性

由此可见,元组最大的用处就是,不用为了 一些简单的结构或对象而去新建一个类了。
注意的是tuple最多支持8个成员,如果成员超过了8个我们可以将第8个成员当成一个元组,通过元祖的嵌套去完成,如

列如:Tuple<string, int, int, int, int, int, int, Tuple<int, int, int>>  红色部分是第8个。这里的第八个成员又是一个元组。

二、元组的使用

1、元组对象的创建和遍历

创建元组对象有两种方法,如下:

           //通过构造函数创建元组对象
            Tuple<string, int, double> tuple1 = new Tuple<string, int, double>("数学", 100, 100.1);
            //通过静态函数创建元组对象
            Tuple<string, int, double> tuple2 = Tuple.Create<string, int, double>("英语", 200, 200.2);
            //元组对象的遍历,元组对象有一个默认的item属性
            Console.WriteLine($"{tuple1.Item1}  {tuple1.Item2}  {tuple1.Item3}");
            Console.WriteLine($"{tuple2.Item1}  {tuple2.Item2}  {tuple2.Item3}");

2、元组与数据集合的结合

按照之前创建自定义的数据类型的使用方法,我们一般是使用  List<Person> listPerson=new List<Person>(); 但是通过元组我们如下所示:

 List<Tuple<string, string, int, int, int>> listPerson = new List<Tuple<string, string, int, int, int>>()
            {
                new Tuple<string, string, int, int, int>("菲菲","女",23,161,50),
                new Tuple<string, string, int, int, int>("张三","男",25,171,66),
                Tuple.Create<string,string,int,int,int>("李四","男",25,178,78)
            };
            foreach (var item in listPerson)
            {
                Console.WriteLine($"{item.Item1}  {item.Item2}  {item.Item3}  {item.Item4}  {item.Item5}");
            }

3、拓展

在最新的C#7.0语法中,增加的元组类型和元组文字:

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

这个方法可以有效地返回三个字符串,以元素的形式包含在一个元组值里。

这种方法的调用将会收到一个元组,并且可以单独地访问其中的元素:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

Item1 等是元组元素的默认名称,也可以被一直使用。但他们不具有描述性,所以你可以选择添加更好的:

(string first, string middle, string last) LookupName(long id) // tuple elements have names

现在元组的接收者有多个具有描述性的名称可用:

var names = LookupName(id);
WriteLine($"found {names.first} {names.last}.");

你也可以直接在元组文字指定元素名称:

return (first: first, middle: middle, last: last); // named tuple elements in a literal

一般可以给元组类型分配一些彼此无关的名称:只要各个元素是可分配的,元组类型就可以自如地转换为其他的元组类型。也有一些限制,特别是对元组文字,即常见的和告警错误,如不慎交换元素名称的情况下,就会出现错误。

Note:这些限制尚未在 Preview 4 中实现。

元组是值类型的,它们的元素是公开的,可变的。他们有值相等,如果所有的元素都是成对相等的(并且具有相同的哈希值),那么这两个元组也是相等的(并且具有相同的哈希值)。

这使得在需要返回多个值的情况下,元组会非常有用。举例来说,如果你需要多个 key 值的字典,使用元组作为你的 key 值,一切会非常顺利。如果你需要在每个位置都具有多个值的列表,使用元组进行列表搜索,会工作的很好。

Note:元组依赖于一组基本类型,却不包括在 Preview 4 中。为了使该特性工作,你可以通过 NuGet 获取它们:

  • 右键单击 Solution Explorer 中的项目,然后选择“管理的NuGet包......”
  • 选择“Browse”选项卡,选中“Include prerelease”,选择“nuget.org”作为“Package source”
  • 搜索“System.ValueTuple”并安装它。

猜你喜欢

转载自blog.csdn.net/mss359681091/article/details/80089620