在c#中通过索引获取元组值

Woj*_*icz 4 c#

我有一个问题,我有一个简单的命名元组和一个配置,在 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 找不到这种类型。

我这可能吗?

can*_*on7 5

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)