2013-05-11 90 views
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

B,d,E

將產生:

A

....乙

........Ç

........ d

....Ç

........ d

.... d

........Ë

等....

目前我的解決方案是相當破解了,雖然它的工作原理,我想要拿出一個「酷」的方式做到這一點。

回答

0

可以實現通過調用打印方法遞歸地向它提供的項目的子集打印和深度迄今爲止印製的樹。我修改了你的類以包含一個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 
+0

你達人。感謝那個,發現我的朋友。 – 2013-05-11 04:11:51

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; 
     }    
    } 
} 
+0

我絕對看到你的觀點,但是我只需要將這個權利打印到屏幕上,所以我的解決方案不應該要求對象模型來完成。很多人同意你的觀點與子類。任何快速的計算器例程? – 2013-05-11 02:39:28