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

How can I extract an int, from (int, int) format variable? It says I can't use indexing

我正在研究 NeuralNet,我决定以 (int,int) edge 格式存储网络的边缘(连接)。 我使用它是因为将它添加到列表中非常容易 List<(int,int)> listOfConnections

我已经在我的代码中的多个地方实现了这个变量,直到现在我才意识到我不确定如何分别访问每个 int。 当我尝试 edge[0] 时出现错误,提示我无法在此类变量中使用索引。

知道如何分别提取第一个和第二个整数吗? 还有这种形式的变量的名称是什么?它不是Touple,也不是Vector,如果我知道这个名字也许我可以找到更多关于如何使用它的信息。

您已经创建了 ValueTuple

您可以使用 edge.Item1 访问第一个项目,使用 edge.Item2 访问第二个项目。

.NET Fiddle Example

元组不支持 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

..但是如果你在列表声明中给出你的元组名称:

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),您使用的名称取决于上下文的 most-recently-given 定义:

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,因此他们将以此序列化。你的源代码调用它们的知识已经消失了..