如何从 (int, int) 格式变量中提取 int?它说我不能使用索引



我正在开发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所说的,有一个Item1Item2。。

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,所以它们会序列化为这样。你的源代码称之为它们的知识已经不复存在了。。

相关内容

最新更新