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”并安装它。
C#中的元组对象Tuple的更多相关文章
- Python学习-30.Python中的元组(tuple)
元组使用()定义,元组一旦定义就无法修改. 元组的索引方式同列表,也是使用[]. 元组也可以进行切片操作,使用方式同列表一样. 可以说,一个没法修改的列表就是元组. 在没有修改操作的情况下,应尽可能使 ...
- C#中的元组(Tuple)和结构体(struct)
在正常的函数调用中,一个函数只能返回一个类型的值,但在某些特殊情况下,我们可能需要一个方法返回多个类型的值,除了通过ref,out或者泛型集合可以实现这种需求外,今天,讲一下元组和结构体在这一方面的应 ...
- Python中的数据结构 --- 元组(tuple)、字典(tuple)
元组(tuple)本身是不可变数据类型,没有增删改查:元组内可以存储任意数据类型一.元组的创建 例:t = (1,2.3,'star',[1,2,3]) ## 元组里面包含可变类型,故 ...
- 11.python中的元组
在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b
- Python中的可变对象和不可变对象
Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
- Python3 元组(tuple)
一.定义:不可变序列的数据元素集合,元组的元素是不可以修改的 元组使用小括号,例如:tuple = (1,) 注意:即使元组里面只有一个元素,该元素后面也要加 ",":在函数传递参 ...
- 6、python中的元组
元组(tuple)是python中有序.不可变的数据结构.元组还是python四种数据结构中唯一一种不可变的数据结构. 一.前言 元组在很多方面都变现得跟列表一样,除了列表储存得对象是可变得,而元组储 ...
- 元组(tuple)的用途(基础)
>>>a = 123,456,'jia',['jia','xiang'] >>>a (123, 456, 'jia', ['jia', 'xiang']) 这个带括 ...
- python中一些元组知识
元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 实例(Pytho ...
随机推荐
- Java_2.Java编程规范
Java源程序有一些约定俗成的命名规定,如下: 包名:全小写名词,如java.util.List 类名:首字母大写,通常由多个单词合成一个类名,每个首字母都大写,如StudentServiceImpl ...
- 解惑结构体与结构体指针(struct与typedef struct在数据结构的第一道坎)
/* 数据结构解惑01 在数据结构中会看到 typedef struct QNode { QElemType data; //数据域 struct QNode *next; //指针域 }QNode ...
- Python爬虫抓取 python tutorial中文版,保存为word
看到了中文版的python tutorial,发现是网页版的,刚好最近在学习爬虫,想着不如抓取到本地 首先是网页的内容 查看网页源码后发现可以使用BeautifulSoup来获取文档的标题和内容,并保 ...
- Docker 清理容器 log 日志
原文 Docker 清理容器 log 日志 docker logs <容器ID> 是常用命令,来查看容器运行日志,但时间长了之后,就会发现越来越慢,log 太多了,这时就需要清理一下. 先 ...
- Docker 在 centos 7上升级
Docker 在 centos 7上升级 狂暴的蚂蚁 关注 2017.05.22 10:49* 字数 194 阅读 3253评论 0喜欢 1 引子 如果有旧的Docker 先删除 旧Docker版本上 ...
- Linux系统测试端口连通性的方法
Linux系统测试端口连通性的方法 有四种常用方法:1. telnet 方法2. wget 方法3. ssh 方法4. curl 方法 下面一一介绍. 1. telnet用法: telnet ip p ...
- sublime text的快捷键
Ctrl + Shift + P:调出命令板(Command Palette)Ctrl + `:调出控制台Ctrl + Enter:在当前行下面新增一行然后跳至该行Ctrl + Shift + Ent ...
- 力扣—— Swap Nodes in Pairs(两两交换链表中的节点) python实现
题目描述: 中文: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, ...
- mongodb C#连接报错 Invalid credentials for database 'admin'
这2天学习mongodb3.2.9,用户设置好了,结果用C#查询的时候报错了,看字面意思是用户验证没通过,但是我用shell是完全没有问题的,后来网上搜了下,发现原来是我用的是旧驱动,旧驱动用的是旧的 ...
- oracle中sys,system,scott,hr用户
https://blog.csdn.net/xingfeng0501/article/details/6699390 scott 是个演示用户,是让你学习ORACLE用的 hr用户是个示例用户,是在创 ...