我正在开发NeuralNet,我决定将网络的边(连接(存储为(int,int) edge
格式。我使用它是因为很容易将它添加到列表List<(int,int)> listOfConnections
中
我已经在代码的多个地方实现了这个变量,直到现在我才意识到我不知道如何单独访问每个int。当我尝试edge[0]
时,我得到一个错误,我不能在这种类型的变量中使用索引。
有什么想法吗?我该如何分别提取第一个和第二个int?这种形式的变量的名称是什么?它不是Touple,也不是Vector,如果我知道这个名字,也许我可以找到更多关于如何使用它的信息。
您已经创建了一个ValueTuple。
您可以使用edge.Item1
访问第一个项目,使用edge.Item2
访问第二个项目。
.NET Fiddle示例
元组不支持C#中的索引。要访问元组中的单个成员,请使用以下语法:
(int, int) edge = (3, 8)
Console.Writeline(edge.Item1) // 3
Console.Writeline(edge.Item2) // 8
或者,为了更好的可读性,您可以命名元组成员:
(int foo, int bar) edge = (3, 8)
Console.Writeline(edge.foo) // 3
Console.Writeline(edge.bar) // 8
或者使用元组拆包:
(int foo, int bar) = (3, 8)
Console.Writeline(foo) // 3
Console.Writeline(bar) // 8
所以你有一个充满ValueTuple:的列表
var edge = (1, 2);
var var listOfConnections = new List<(int, int)>();
每个项目都是一个(int, int)
,就像Broots所说的,有一个Item1
和Item2
。。
listOfConnections[0].Item1
但是如果您在List声明中给出元组名称:
var listOfConnections = new List<(int Prev, int Next)>();
你可以使用这些名称:
listOfConnections[0].Prev
或者,如果你想给它们不同的名称,不管它们当前的名称是什么,你可以将元组定义为在变量签名中有不同的名称:
List<(int Start, int End)> someList = listOfConnections;
someList[0].Start;
或者,如果你想挖掘出具有不同名称的ValueTuple;类型";变量作为与名称有关的不同签名:
(int Go, int Stop) x = listOfConnections[0];
x.Go;
或者,如果您想将列表中的ValueTuple分解为一对变量,请为变量提供类型签名,但不要为变量提供名称:
(int node1, int node2) = listOfConnections[0];
Console.Write(a); //node1 is an int variable like any other, e.g. var node1 = 1;
ValueTuples和命名成员的整个过程非常灵活,因为这只是编译器添加的语法糖。它们只是(int, int)
,您使用的名称取决于上下文的最新定义:
public List<(int Foo, int Bar)> GetNodes(){
return ...
}
var x = GetNodes(); //x[0].Foo
List<(int Baz, int Bop)> y = GetNodes(); //y[0].Baz
var z = (List<(int Bob, int Ben)>)GetNodes(); //z[0].Bob
请记住-如果您将这些东西序列化为例如JSON,它们在源代码的上下文中只有名称。当它们被编译时,所有的东西都被称为Item1,Item2,所以它们会序列化为这样。你的源代码称之为它们的知识已经不复存在了。。