如何从 (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
访问第二个项目。
元组不支持 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
..但是如果你在列表声明中给出你的元组名称:
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,因此他们将以此序列化。你的源代码调用它们的知识已经消失了..
我正在研究 NeuralNet,我决定以 (int,int) edge
格式存储网络的边缘(连接)。
我使用它是因为将它添加到列表中非常容易 List<(int,int)> listOfConnections
我已经在我的代码中的多个地方实现了这个变量,直到现在我才意识到我不确定如何分别访问每个 int。
当我尝试 edge[0]
时出现错误,提示我无法在此类变量中使用索引。
知道如何分别提取第一个和第二个整数吗? 还有这种形式的变量的名称是什么?它不是Touple,也不是Vector,如果我知道这个名字也许我可以找到更多关于如何使用它的信息。
您已经创建了 ValueTuple。
您可以使用 edge.Item1
访问第一个项目,使用 edge.Item2
访问第二个项目。
元组不支持 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
..但是如果你在列表声明中给出你的元组名称:
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,因此他们将以此序列化。你的源代码调用它们的知识已经消失了..