129 lines
5.0 KiB
Markdown
129 lines
5.0 KiB
Markdown
![]() |
#unity/日常积累
|
|||
|
|
|||
|
![[Pasted image 20230717101103.png]]
|
|||
|
|
|||
|
首先声明的是 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 个重载方法,下面展示了这些方法签名清单。
|
|||
|
|
|||
|
``` cs
|
|||
|
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。
|
|||
|
|
|||
|
``` cs
|
|||
|
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,下面的代码清单展示了如何去实现。
|
|||
|
|
|||
|
``` cs
|
|||
|
foreach (Tuple<int, string, string> tuple in listEmployee)
|
|||
|
{
|
|||
|
Console.WriteLine(tuple.Item2);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
下面是完整的代码清单展示了如何去 创建,初始化,迭代。
|
|||
|
|
|||
|
``` cs
|
|||
|
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,如下代码所示:
|
|||
|
|
|||
|
``` cs
|
|||
|
static void Main(string[] args)
|
|||
|
{
|
|||
|
var tuple = Tuple.Create(1, "Joydip Kanjilal", new Tuple<string, string>("Hyderabad", "India"));
|
|||
|
}
|
|||
|
```
|
|||
|
|