递归类型数组的递归方法重复值

Recursive method on array of a recursive type duplicates values

我正在研究递归类型以适应它们并学习,我写了以下内容class:

public class ParameterData
{
    public string[] Values { get; set; } = new string[0];
    public ParameterData[] NestedValues { get; set; } = new ParameterData[0];

    public bool IsNested { get => NestedValues.Length > 0; }
    public int Length { get => IsNested ? NestedValues.Length : Values.Length; }

    public dynamic this[int pos]
    {
        get
        {
            if (IsNested) return NestedValues[pos];
            else return Values[pos];
        }
        set
        {
            if (IsNested) NestedValues[pos] = value;
            else Values[pos] = value;
        }
    }

    public static implicit operator ParameterData[](ParameterData value)
    {
        if (Object.ReferenceEquals(null, value))
            throw new ArgumentNullException("value");

        return value.NestedValues;
    }
}

这似乎工作正常,至少根据调试器中显示的值。

我曾尝试使用它们,试图了解递归类型在哪些方面有用,但我 运行 遇到了一个问题,一个“简单”循环 运行s 2遍历嵌套项,我无法确定这是由于对象设计不当还是循环编码不当造成的。你能给我一些见解吗?

代码:

[TestMethod()]
public void LoadingWindowTest()
{
        ParameterData[] temp = new ParameterData[]{
            new ParameterData {Values=new string[]{ "Titulo" } },
            new ParameterData {Values=new string[]{ "Autor1" , "Autor2" } },
            new ParameterData {NestedValues=new ParameterData[]{
                new ParameterData {NestedValues=new ParameterData[]{
                    new ParameterData {Values = new string[]{"Hola"} },
                    new ParameterData {Values = new string[]{"Don", "Pepito"} }
                } },
                new ParameterData {Values = new string[]{"Outta Nest"} }
            } },
            new ParameterData {Values=new string[]{ "Last" } }
        };

        print(temp);
}

private void print(ParameterData[] data, int indent = 0)
{
        for (int i = 0; i < data.Length; i++)
        {
            for (int x = 0; x < data[i].Length; x++)
            {
                if (data[i][x] is string) Console.WriteLine("" + indent + data[i][x]);
                else print(data[i], indent + 1);
            }
        }
}

这是输出:

编辑: 为了澄清这个问题:以大于 0 的值开头的每一行都是重复的。此外它是指数的,这些线被 2^n 复制,其中 n 是线的“级别”。

正如 Peter Duniho 所说,我的问题来自使用 2 个循环。以下代码按预期工作:

private void print(ParameterData[] data, int indent = 0)
    {
        for (int i = 0; i < data.Length; i++)
        {
            if (data[i].IsNested) print(data[i], indent + 1);
            else
            {
                for (int x = 0; x < data[i].Length; x++) Console.WriteLine("" + indent + data[i][x]);
            }
        }
    }

我之所以感到困惑,是因为我实现了一个索引器(为此),这造成了使用二维数组的错觉。

对于将来可能遇到类似问题的任何人:

  • 不要在不需要的地方使用索引器(或其他任何东西)
  • 包含自身数组的类型的数组将是 n 维的,无论它看起来如何(这应该是显而易见的,但我在这里遇到了这个问题)。