C#关键字扫盲——Tuple(元组类) 、ValueTuple(值元组)

本文详细介绍C#中ValueTuple的使用方法,包括其与Tuple的区别、基本用法、返回值加别名的简便操作、解构返回值的技巧及在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://blog.youkuaiyun.com/Michel4Liu/article/details/79750877

当方法返回值大于一个时我们有时用out或结构体或类来处理,今天介绍一个简便的多返回值方式。
ValueTuple 是 Tuple的扩展,本文只针对最新的ValueTuple 做讲解,Tuple有很多不便之处,总之过时的就让他过去吧。

TupleValueTuple
.Net Framework 4.0 内置Nuget 安装System.ValueType 和 Net4.7内置
是一个类是一个结构

一、ValueTuple基本用法

1、接收值可用Item表示,可以识别类型.
2、接收时改别名,相当于直接声明三个变量接受对应值
3、ValueTuple可以简写

二、ValueTuple 返回值加别名 最简单明了的用法。

三、解构ValueTuple 返回值中只想要部分

不想要的参数可以用 “_” 下划线代替,下图中只接受y值
这里写图片描述

四、创建ValueTuple

五、刚看完就在真实项目中用到

附:
[C#7] 1.Tuples(元组)

<think>我们正在处理的问题:用户询问如何在C#中对元组Tuple)进行排序。根据提供的引用,特别是引用[1]引用[2],我们可以找到一些线索。引用[1]提到:有一个List<Tuple<double,int>>,想根据Tuple中的double值(第一个元素)从小到大进行排序,使用List的Sort方法并传入自定义比较器。引用[2]则给出了一个简单的降序排序示例,使用lambda表达式CompareTo方法,并在前面加负号实现降序。因此,我们可以这样回答:1.如果要排序的是List<Tuple<T1,T2,...>>,那么可以使用List的Sort方法,并提供一个自定义的比较委托。2.在比较委托中,我们可以指定按照元组的某个元素进行排序(如第一个元素,第二个元素等)。另外,引用[3]中有一个HTuple的示例,但那是Halcon的特定型,与标准C#Tuple不同,所以我们不采用。根据用户的需求,给出对Tuple排序的示例。由于元组是不可变的,所以排序操作通常会返回一个新的排序后的集合(如果是List的话,可以使用原地排序,即Sort方法会改变原列表)。注意:C#中的Tuple有两种形式:System.Tuple(不可变,最多到Tuple<T1,...,T7,TRest>)System.ValueTuple(可变的,并且有更好的语法支持)。这里用户没有特别指明,我们以System.Tuple为例。示例:假设我们有一个List<Tuple<double,int>>,我们想按Item1(double)升序排序。代码:List<Tuple<double,int>>list=newList<Tuple<double,int>>();//添加一些元素list.Add(Tuple.Create(3.5,1));list.Add(Tuple.Create(1.2,2));list.Add(Tuple.Create(2.7,3));//按Item1升序排序list.Sort((a,b)=>a.Item1.CompareTo(b.Item1));如果要降序,则:list.Sort((a,b)=>b.Item1.CompareTo(a.Item1));或者list.Sort((a,b)=>-a.Item1.CompareTo(b.Item1));//如引用[2]所述另外,我们也可以使用LINQ的OrderBy方法,但是这会返回一个新的序列,不会改变原列表:升序:varsortedList=list.OrderBy(t=>t.Item1).ToList();降序:varsortedList=list.OrderByDescending(t=>t.Item1).ToList();用户提到的是“对元组进行排序”,但实际上是对包含元组的列表进行排序。因为元组本身并没有排序的功能,它们是用来存储多个值的容器。因此,我们给出两种方法使用List.Sort(原地排序)使用LINQ(生成新列表)。如果元组是其他形式的(比如不是List,而是数组),那么可以使用Array.Sort,但同样需要提供比较器。另外,对于System.ValueTupleC#7.0以后),语法似,但创建元组使用括号:(3.5,1),比较时也是使用Item1等。但是用户的问题中没有特别说明,我们就以System.Tuple为例。最后,根据要求生成相关问题。</think> 根据提供的参考内容,以下是 C# 中对元组进行排序的详细方法及示例: ### 1. 使用`List.Sort()`自定义比较器(原地排序) ```csharp List<Tuple<double, int>> mm = new List<Tuple<double, int>>() { Tuple.Create(2.5, 1), Tuple.Create(1.3, 4), Tuple.Create(3.7, 2) }; // 按元组第一个元素(double)升序排序 mm.Sort((x, y) => x.Item1.CompareTo(y.Item1)); // 结果:[(1.3, 4), (2.5, 1), (3.7, 2)] // 按元组第一个元素降序排序(加负号实现[^2]) mm.Sort((x, y) => -x.Item1.CompareTo(y.Item1)); // 结果:[(3.7, 2), (2.5, 1), (1.3, 4)] ``` > 特点:直接修改原始列表,无需额外内存 ### 2. 使用 LINQ 排序(生成新序列) ```csharp var sorted = mm.OrderBy(t => t.Item1).ToList(); // 升序 var sortedDesc = mm.OrderByDescending(t => t.Item2).ToList(); // 按第二个元素降序 ``` ### 3. 多级排序(先按第一元素,再按第二元素) ```csharp mm.Sort((x, y) => { int primary = x.Item1.CompareTo(y.Item1); return primary != 0 ? primary : x.Item2.CompareTo(y.Item2); }); ``` ### 4. 值元组(ValueTuple)排序示例(C# 7.0+) ```csharp var list = new List<(string Name, int Age)>() { ("John", 25), ("Alice", 30), ("Bob", 25) }; // 按年龄升序,同年龄按字母降序 list.Sort((x, y) => { int ageComp = x.Age.CompareTo(y.Age); return ageComp != 0 ? ageComp : -x.Name.CompareTo(y.Name); // 负号实现降序[^2] }); ``` **关键区别**: - `List.Sort()`:原地排序,修改原始集合 - LINQ `OrderBy`:返回新序列,原始集合不变 - 比较器返回值规则:负数(x<y)、0(相等)、正数(x>y) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值