0

我有数组列表:

List<HeaderItem> _headerItems = new List<HeaderItem>();


class HeaderItem
{
    private string[] _headers = new string[6];

    public string this[int index]
    {

        get
        {
            return _headers[index];
        }
        set
        {
            _headers[index] = value;
        }
    }
}

数组中的 6 个项目中的每一个都代表层次结构中的一个级别。如果数组位置 0 中的所有项目都匹配,则将存在单个根级别节点。

所以,

A,B,C

A,B,D

B,C,D

乙、丁、乙

会产生:

一个

....乙

........C

........D

....C

........D

....D

...........E

ETC....

目前我的解决方案已经被破解了,虽然它有效,但我正在尝试想出一种“酷”的方式来做这件事。

4

2 回答 2

0

每当制作树时,总​​是像这样在该实体中创建一个实体列表

class HeaderItem
{
    private string[] _headers = new string[6];

    private List<HeaderItem> _items;

    public string this[int index]
    {
        get
        {
            return _headers[index];
        }
        set
        {
            _headers[index] = value;
        }
    }

    public List<HeaderItem> Items
    {
        get
        {
            if (_items == null)
                _items = new List<HeaderItem>();
            return _items;
        }            
    }
}
于 2013-05-11T02:31:55.833 回答
0

您可以通过递归调用 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
于 2013-05-11T03:25:59.227 回答