您可以通过递归调用 print 方法来实现这一点,为它提供要打印的项目的子集和到目前为止打印的树的深度。我修改了你的类以包含一个Length
属性,这样调用者就不必总是假设它是 6。我还添加了一个构造函数来简化我的初始化。可能在您的代码中没有意义。
public class HeaderItem
{
public HeaderItem(string headers)
{
_headers = headers.ToCharArray().Select(x => x.ToString()).ToArray();
}
private string[] _headers = new string[6];
public int Length
{
get { return _headers.Length; }
}
//...
}
这是打印方法。看看它是如何进行分组然后递归调用自身的:
private static void PrintHeaders(IEnumerable<HeaderItem> headerItems, int depth = 0)
{
var result =
headerItems.Where(h => h.Length > depth)
.GroupBy(h => h[depth], h => h,
(k, g) => new {Key = k, Items = g})
.OrderBy(g => g.Key);
foreach (var pair in result)
{
Console.Write(new string('.', depth)); // change here to add more dots
Console.WriteLine(pair.Key);
PrintHeaders(pair.Items, depth + 1);
}
}
这就是你可以开始调用它的方式:
PrintHeaders(_headerItems);
对于测试,这是我的Main
方法:
static void Main(string[] args)
{
_headerItems.Add(new HeaderItem("abc"));
_headerItems.Add(new HeaderItem("abd"));
_headerItems.Add(new HeaderItem("acd"));
_headerItems.Add(new HeaderItem("ace"));
_headerItems.Add(new HeaderItem("bce"));
_headerItems.Add(new HeaderItem("bcd"));
_headerItems.Add(new HeaderItem("bef"));
PrintHeaders(_headerItems);
Console.ReadLine();
}
这是结果:
a
.b
..c
..d
.c
..d
..e
b
.c
..d
..e
.e
..f