我有一个问题,我有一个简单的命名元组和一个配置,在 8 种情况下我应该使用元组值,但通过索引,所以它看起来像:
private int[] delayParametersIndexSetup = new int[] {1, 0, 0, 1, 1, 0, 0, 1 };
private (int delayWheel, int delayDiag) delayParameters = (1, 500);
Run Code Online (Sandbox Code Playgroud)
换句话说,当我迭代delayParametersIndexSetup时,我想要一个由该索引表示的元组值,如下所示:
foreach (var index in delayParametersIndexSetup)
{
var value = this.delayParameters.ToTuple()[index];
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 Item1、Item2 等,但我希望在不使用 case 语句的情况下更加灵活。
我读到我可以使用 ITuple (item[x] 属性,如文档中所示),但我的 VS 找不到这种类型。
我这可能吗?
ValueTuple显式实现ITuple,所以你可以这样做:
int value = (int)((ITuple)this.delayParameters)[index];
Run Code Online (Sandbox Code Playgroud)
然而,这将导致两个装箱操作:首先将元组作为一个整体装箱(因为它被转换为ITuple),然后将特定的元组成员装箱。因此这可能是一个坏主意!
您可能最好用数组替换元组,或者像这样的自定义对象:
public struct DelayParameters
{
public int DelayWheel { get; }
public int DelayDiag { get; }
public int this[int index] => index switch
{
0 => DelayWheel,
1 => DelayDiag,
_ => throw new IndexOutOfRangeException(nameof(index)),
};
public DelayParameters(int delayWheel, int delayDiag) =>
(DelayWheel, DelayDiag) = (delayWheel, delayDiag);
}
Run Code Online (Sandbox Code Playgroud)