元组

元组是什么?如下两个都是元组,类似数组的感觉。

(1,2,3)

("abc",2)

能用元组的地方,基本上用class也都可以实现,那么为何还要元组呢?

对于元组,我对其的理解就是“方便快速使用”。



第一种场景:直接赋值

这种方式,对于一次性使用数据对象时,就免去了创建class的过程。

var results = (1, 2, 3, "Name","Time");  
// 等价于 var ( Item1, Item2, Item3, Item4, Item5)
Console.WriteLine(results);
Console.WriteLine(results.Item1 + "," + results.Item2 + "," + results.Item3);

第二种场景:函数返回元组

这种方式是常用的,调用函数执行完某个功能,返回执行结果,但是这个结果可以多次传递使用时,就可以使用元组。

results = GetTupleDataOne(rnd);
results.Item2 = 3;
Console.WriteLine(results);

新增如下辅助测试示例函数:

private (int, int, int, string, string) GetTupleDataOne(Random rnd)
{
return (1, 1, 1, "One", (rnd).Next(1, 1000).ToString());
}

第三种场景:逐个字段命名

有些时候,可能需要直接命名,这样更好理解每个字段含义,不过,也可以看出这个弊端,这样子快和写一个新的class差不多了,所以,我不怎么用这种。

(int i1, int i2, int i3, string name, string time) = GetTupleDataOne(rnd);
Console.WriteLine($"{i1} {i2} {i3} {name} {time}");

第四种场景:已有变量 + 弃元

遇到弃元,虽然元组返回多个数据,但是我只想要其中某两个的时候,可以使用这种写法,而且将数据返回到已有变量中。

string Name, Time;
(_, _, _, Name, Time) = GetTupleDataOne(rnd);
Console.WriteLine($"{i1} {i2} {i3} {name} {Time}");

第五种场景:对class 添加Deconstruct方法

对于类对象,也可以方便的获取其成员变成元组数据,这里使用Deconstruct方法。这样后续使用该功能的时候,就不用主动明显的调用方法。

var p = new PersonEx("A1", "B1", "C1", "D1", "G1");

// 调用Deconstruct方法,快速获取p的数据,并赋值到元组上。
var (fName, lName, city, state) = p;
var (fName1, lName1) = p;
Console.WriteLine($" {fName} {lName} {city} {state}");
class PersonEx
{
public string N1 { get; set; }
public string N2 { get; set; }
public string N3 { get; set; }
public string C1 { get; set; }
public string S1 { get; set; }
public PersonEx(string n1, string n2, string n3,
string c1, string s1)
{
N1 = n1;
N2 = n2;
N3 = n3;
C1 = c1;
S1 = s1;
}
// Return the first and last name.
public void Deconstruct(out string n1, out string n3)
{
n1 = N1;
n3 = N3;
}
public void Deconstruct(out string n1, out string n2, out string n3)
{
n1 = N1;
n2 = N2;
n3 = N3;
}
public void Deconstruct(out string n1, out string n3,
out string c1, out string s1)
{
n1 = N1;
n3 = N3;
c1 = C1;
s1 = S1;
}

}

小结

元组只是一种方便快捷的数据类型,得根据使用场景挑选使用,很多时候可能用不到它,毕竟很久以前没有它的存在,C#过的也很好。