【发布时间】:2016-07-05 20:00:29
【问题描述】:
我正在尝试打印带有子项的列表,所有子项都以数字分隔,例如:
1 项 1 2 项目 2 2.1 项目 2 子 1 2.2 项目 2 子 2 2.2.1 项目 2 子 2 子 1 3 最后即:
- 项目编号从 1 开始。
- 项目应在打印前带有“行标题”,以显示其项目编号。
- 当列表中的项目本身是一个列表时,其元素将使用前一个项目的行标题打印,并附加当前列表的每个元素的项目编号。 IE。标题看起来像
#.#...#.X,其中#.#...#表示由该规则构造的上一个项目的行标题,X是当前列表中当前元素的项目编号。 - 如果列表作为列表中的第一项出现,因此没有“前项”,则假定前项是为了生成“前一项的行标题”,即行标题将包括
1的索引值,即使之前没有具有该索引的项目。
我几乎可以使用这段代码:
var input = new List<object>
{
"item 1",
"item 2",
"item 3",
new List<object>{
"level 2, item 1",
"level 2, item 2",
new List<object>{
"level 3, item 1",
new List<object>{
"level 4, item 1",
"level 4, item 2"
},
"level 3, item 2",
},
"level 2, item 3",
},
"last item"
};
public static string Solve(List<object> list, int level = 0, int subLevel = 0)
{
var result = new StringBuilder();
if (level == subLevel)
{
level = 0;
}
list.ForEach(x =>
{
var type = x.GetType();
if (subLevel != 0)
{
result.Append(subLevel.ToString() + ".");
Console.Write(subLevel.ToString() + ".");
}
if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(List<>)))
{
var newLevelList = x as List<object>;
result.Append(Solve(newLevelList, level, level));
}
else
{
level = level + 1;
result.AppendLine(level.ToString() + " " + x.ToString());
Console.WriteLine(level.ToString() + " " + x.ToString());
}
});
return result.ToString();
}
但它不适用于第 4 级子项,例如以下示例:
我得到这个输出:
1 项 1 2 项目 2 3 项目 3 3.1 2级,第1项 3.2 2级,第2项 3.2.1 3级,第1项 2.1.1 4级,第1项 1.2 4级,第2项 2.2 3级,第2项 3.3 2级,第3项 4 最后一项我错过了什么?我也愿意接受新的解决方案。
【问题讨论】:
-
不要使用
List<T>和使用List<T>.ForEach使用IEnumerable和普通foreach(我怀疑它会解决你的问题) -
看起来你没有增加 subLevel 参数,而是使用 level 参数。行内:result.Append(Solve(newLevelList, level, level));
-
请提供一个良好的minimal reproducible example 以可靠地重现问题。在给出您描述的 exact 输入的情况下,还请提供您希望获得的 exact 输出的清晰、准确的描述。根据您声称使用的输入和您显示的代码,我看不出您如何获得像
"item 1"这样的输出。我当然可以想象一个更简单的实现来实现您似乎想要的东西,但是如果没有更精确的问题,就不清楚您在寻找什么答案。 -
您不能检查
typeof(List<>),然后强制转换为List<object>,因为该列表包含任何内容,而不仅仅是object。