【.NET深呼吸】元组数据(Tuple)
各位观众,大家好,欢迎收看由火星电视台直播的《老周吹牛》节目,注意:本节目没有任何技术含量,如果您没有兴趣,请砸掉电视机。
今天说一下System命名空间下的一个数据类型——Tuple,翻译过来叫“元组”,其实翻译后我也不知道什么意思,很多专有名词翻译后都不知道什么意思。
尽管不知道是什么意思,不过,我知道怎么用。
Tuple比较类似于数组等集合类型,不同的是,Tuple允许每个元素的类型不同,并且是通过泛型参数来指定元素类型,而且必须严格按照顺序来赋值。比如,三元组包括三个元素,类型为int,string,double,那么,在创建Tuple实例并为各个元素分配值的时候,第一个参数必须为int类型的值,第二个参数的值必须是string类型的值,第三个参数的值必须为double类型的值。
Tuple不仅仅是强类型的集合,而且是有次序的,可谓是“等级森严”。
.NET高大上类库定义了N个Tuple类,可以包含的元素为1到7个。如下图所示。
你会不会觉得,这样的形式和Action委托很像?
确实差不多。如果Tuple是包含两个元素的元组,那么它会包含Item1和Item2两个属性,可以直接访问对应的元素。如果Tuple有四个元素,就会有Item1、Item2、Item3、Item4四个属性以供访问。
实则,Tuple用起来没什么技术难度,它的作用就是方便将几个数据组织在一起。比如在执行新线程时,通过可以传递给线程的参数只有一个,并且是object类型的。如果要传递的参数是多个值,以前的做法是定义一个自定义类去包装。但你不妨想想,为了传递一个参数而临时跑去定义一个新类,很费工夫。这时候可以用上Tuple类了。
Tuple实例化有两种方法,一种是找到适合的Tuple,比如 Tuple<T1, T2>,直接调用其构造函数实例化。
Tuple<int, int> t = new Tuple<int, int>(300, 999);
Console.WriteLine($"Item1 = {t.Item1}, Item2 = {t.Item2}");
这个Tuple有两个元素,每个元素都是int类型,实例化时通过构造函数来赋值。然后可以用Item1和Item2属性分别获取元素的值。
还有一种方法是使用Tuple类的静态方法来创建合适的Tuple实例。
Tuple<string, int, string> t2 = Tuple.Create<string, int, string>("小明", 33, "天边有朵云"); string msg = $"Item1 = {t2.Item1}, Item2 = {t2.Item2}, Item3 = {t2.Item3}"; Console.WriteLine(msg);
上面代码创建的Tuple有三个元素,第一个元素是字符串类型的值,第二个元素为整型,第三个元素为字符串。
如果希望一个方法返回多个值,也可用Tuple作为返回值:
static Tuple<int, decimal, char> DoSomething() { return Tuple.Create<int, decimal, char>(95, 60.0015m, 'x'); }
以上方法返回一组值,分别为int类型、decimal类型、char类型的值。
在多线程编程中还可以用Tuple来充当要传递的参数。
Tuple<string, string> t3 = new Tuple<string, string>("desk", "table"); Task newtask = new Task(p => { Tuple<string, string> ttmp = p as Tuple<string, string>; // …… }, t3); newtask.Start();
上面代码将带有两个string元素的Tuple对象传递给新的Task。
好,由于设制组资金短缺,本期节目到此结束。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战