如何使用 C# 中的 Tuple

本文详细介绍了Tuple在编程中的概念和用途,强调了Tuple作为不可变、有序的数据结构,常用于返回多个值、传递多个值以及简化混杂元素访问的场景。在C#中,可以通过Tuple.Create方法创建不同数量元素的Tuple实例。虽然Tuple具有便利性,但其只读性质、不直观的元素访问方式和内存分配问题也需要注意。文章还展示了如何创建、初始化和迭代Tuple的示例代码。

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

开局一张图,首先声明的是 Tuple 不是什么新鲜概念,在编程语言 F#,Python 中早就有这个了,Tuple 是一种 有序的,有限不可变的,支持混杂类型的固定个数的 一种数据结构,有些朋友可能就想问了,这里的混杂是什么意思? 其实就是说 Tuple 中的若干元素类型,即可以是同类型,也可以是不同类型。

值得注意的是,Tuple 中的元素是 只读的,而且其元素的顺序也是在 Tuple 创建的时候指定好的,不能对其中的元素进行后续修改 也不能修改 Tuple 的大小。

为什么要使用 Tuple

下面罗列了几种使用 Tuple 的场景:

  • 如果你的方法需要返回多个值 或者 方法需要传递多个值。

  • 如果你不想为某些功能专门去定义一个类。

  • 如果你有若干个混杂元素,并且想提供对其简单的访问方式。

上面三种情况都是 Tuple 最擅长的应用场景,值得用 Tuple 去解决。

有些朋友可能会想到 匿名类,但仔细想想, 匿名类 也有其缺陷,比如说方法的返回值是不可能指定为匿名类型的,对吧。

当然 Tuple 也是有缺陷的,罗列如下:

  • 当你访问 Tuple 中的元素时,你会发现只能使用 Item1, Item2, Item3 这样的形式,很显然这种太不易读了,而且一旦 Tuple 中的元素过多,维护起来也是一种负担。

  • Tuple 是引用类型不是值类型,意味着它会在 托管堆 上进行内存分配,如果 Tuple 过大并且没有很好的释放,对程序也是一个不小的性能挑战。

C# 中使用 Tuple

叨叨叨的说了这么多,接下来看看如何使用,在 C# 中提供了一个 Tuple 类,这个类下有一个静态方法 Create 可用来生成 Tuple 实例,顺便提一下,这个 Create 方法提供了 8 个重载方法,下面展示了这些方法签名清单。


public static class Tuple
{
    public static Tuple<T1> Create<T1>(T1 item1)
    {
        return new Tuple<T1>(item1);
    }

    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
    {
        return new Tuple<T1, T2>(item1, item2);
    }

    public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
    {
        return new Tuple<T1, T2, T3>(item1, item2, item3);
    }

    public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
    {
        return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
    }

    public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
    {
        return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
    }

    public static Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
    {
        return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
    }
}

接下来看看如何创建和初始化 Tuple。

            var listEmployee = new List<Tuple<int, string, string>>
            {
              Tuple.Create(1, "Joydip Kanjilal", "INDIA"),
              Tuple.Create(2, "Michael Stevens", "USA" ),
              Tuple.Create(3, "Steve Barnes", "USA" )
            };

一旦你的 Tuple 创建并初始化好,你可以像迭代其他集合一样迭代 Tuple,下面的代码清单展示了如何去实现。


            foreach (Tuple<int, string, string> tuple in listEmployee)
            {
                Console.WriteLine(tuple.Item2);
            }

下面是完整的代码清单展示了如何去 创建,初始化,迭代。


        static void Main(string[] args)
        {
            var listEmployee = new List<Tuple<int, string, string>>
            {
                Tuple.Create(1, "Joydip Kanjilal", "INDIA"),
                Tuple.Create(2, "Michael Stevens", "USA" ),
                Tuple.Create(3, "Steve Barnes", "USA" )
            };

            foreach (Tuple<int, string, string> tuple in listEmployee)
            {
                Console.WriteLine(tuple.Item2);
            }
            Console.Read();
        }

你也可以创建 嵌套的 Tuple,如下代码所示:


        static void Main(string[] args)
        {
            var tuple = Tuple.Create(1, "Joydip Kanjilal", new Tuple<string, string>("Hyderabad", "India"));
        }

译文链接:https://www.infoworld.com/article/3095242/how-to-work-with-a-tuple-in-c.html

### C#Tuple 的用法及相关信息 #### 定义与创建元组 在 C# 中,`Tuple` 是一种允许存储多个不同类型的数据项的对象。自 C# 7.0 起引入了轻量级语法来简化 `Tuple` 的声明和使用。 可以直接通过构造函数或者静态方法 `Create()` 来实例化一个 `Tuple` 对象: ```csharp // 使用构造器方式创建 var tuple1 = new Tuple<int, string>(1, "example"); // 或者更简洁的方式——利用工厂方法 Create() var tuple2 = Tuple.Create(1, "example"); ``` 从 C# 7 开始支持解构表达式以及命名返回值特性,使得操作更加直观[^1]。 #### 访问 Tuple 成员 成员可以通过属性名 `.Item1`, `.Item2` 等访问;如果指定了名称,则可通过指定的名字获取对应的元素。 ```csharp (int number, string description) = (1, "example"); Console.WriteLine($"Number is {number}, Description is {description}"); ``` 当不希望为某些组件分配特定名字时,可以用下划线 `_` 占位符忽略它们: ```csharp (_, string desc) = ("ignored", "not ignored"); Console.WriteLine(desc); ``` #### 返回多个值 函数能够借助 Tuples 同时传递几个参数给调用方而无需依赖类或结构体封装这些数据。 ```csharp public static (double sum, double average) CalculateSumAndAverage(IEnumerable<double> numbers) { var list = numbers.ToList(); return (list.Sum(), list.Average()); } ``` 上述代码展示了如何在一个方法里计算并返回集合中所有数值之和及其平均数作为一对关联的结果[^3]。 #### 解包 Tuple 接收端同样可以方便地拆分接收到的复合型态,并将其各个部分分别赋予局部变量。 ```csharp (double total, _) = CalculateSumAndAverage(new[] { 1.5, 2.5 }); Console.WriteLine(total); ``` 这里只关心总和而不关注均值,因此第二个位置用了占位符 `_` 表明该字段被有意省略掉了。 #### 值类型优化 值得注意的是,在 .NET Core 和更高版本中实现了对 ValueTuples 的原生支持,这意味着性能上的改进因为不再需要堆内存分配即可完成对象构建过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值