元组赋值和元组相等比较不会考虑字段名称。
一、元组格式写法:
//元组写法1通过example2.Item来引用 var example1 = (1,2,3,4,5,"23"); Console.WriteLine(example1.Item6); //元组写法2, 通过example3.变量名引用 var example2 = (exa1:1, exa2: 2,3,4,5,6); Console.WriteLine(example2.exa2); //元组写法2, 通过example3.变量名引用 (int age, string name) example3 = (1, "Dog1"); Console.WriteLine(example3.name); //元组写法4 相当于批量赋值 可以单独使用 变量 (string sr, bool sb, int sc) = ("srtest",true,1); Console.WriteLine(sr); //元组写法5 相当于批量赋值 可以单独使用 变量 var example5 = ("post office", 3.6); (string destination, double distance) = example5; Console.WriteLine(distance); //元组写法6 相当于批量赋值 可以单独使用 变量 var exa61 = string.Empty; var exa62 = 0.0; var example6 = ("post office", 3.6); (exa61, exa62) = example6; Console.WriteLine(exa62);
二、元组赋值和析构
C# 支持满足以下两个条件的元组类型之间的赋值:
1、两个元组类型有相同数量的元素
2、对于每个元组位置, 右侧元组元素的类型与左侧相应的元组元素的类型相同或可以隐式转换为左侧相应的元
组元素的类型
(int, double) t1 = (17, 3.14); (double First, double Second) t2 = (0.0, 1.0); t2 = t1; Console.WriteLine(t2);
三、比较运算符!= 和==
元组赋值和元组相等比较不会考虑字段名称。
同时满足以下两个条件时,两个元组可比较:
两个元组具有相同数量的元素。 例如,如果 t1 和 t2 具有不同数目的元素, t1 != t2 则不会进行编译。
对于每个元组位置,可以使用 == 和 != 运算符对左右侧元组操作数中的相应元素进行比较。 例如,
(1, (2, 3)) == ((1, 2), 3) 不会进行编译,因为 1 不可与 (1, 2) 比较。
(int a, byte b) left = (5, 10); (long a, int b) right = (5, 10); Console.WriteLine(left == right); // output: True Console.WriteLine(left != right); // output: False var t1 = (A: 5, B: 10); var t2 = (B: 5, A: 10); Console.WriteLine(t1 == t2); // output: True Console.WriteLine(t1 != t2); // output: False
== 和 != 运算符将以短路方式对元组进行比较。 也就是说,一旦遇见一对不相等的元素或达到元组的末尾,操
作将立即停止。 但是,在进行任何比较之前,将对所有元组元素进行计算,如以下示例所示:
Console.WriteLine((Display(1), Display(2)) == (Display(3), Display(4))); int Display(int s) { Console.WriteLine(s); return s; } // Output: // 1 // 2 // 3 // 4 // False
四、元组作为 out 参数
通常,你会将具有 out 参数的方法重构为返回元组的方法。 但是,在某些情况下, out 参数可以是元组类型。
下面的示例演示了如何将元组作为 out 参数使用:
var limitsLookup = new Dictionary<int, (int Min, int Max)>() { [2] = (4, 10), [4] = (10, 20), [6] = (0, 23) }; if (limitsLookup.TryGetValue(4, out (int Min, int Max) limits)) { Console.WriteLine($"Found limits: min is {limits.Min}, max is {limits.Max}"); } // Output: // Found limits: min is 10, max is 20
五、元组与 System.Tuple
System.ValueTuple 类型支持的 C# 元组不同于 System.Tuple 类型表示的元组。 主要区别如下:
ValueTuple 类型是值类型。 Tuple 类型是引用类型。
ValueTuple 类型是可变的。 Tuple 类型是不可变的。
ValueTuple 类型的数据成员是字段。 Tuple 类型的数据成员是属性。