递归类型数组的递归方法重复值
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 维的,无论它看起来如何(这应该是显而易见的,但我在这里遇到了这个问题)。
我正在研究递归类型以适应它们并学习,我写了以下内容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 维的,无论它看起来如何(这应该是显而易见的,但我在这里遇到了这个问题)。