2010-07-18 61 views
2

我有一個遞歸對象,鏈表真:如何將遞歸對象轉換爲C#中的集合?

public class LinkedList 
{ 
    public string UniqueKey { get; set; } 
    public LinkedList LinkedList { get; set; } 
} 

的LinkedList會有一些對象圖將在LinkedList.LinkedList最終結束== NULL。

我想將圖中的所有對象放到LinkedList集合中,以便我可以遍歷它們。我如何在C#中執行此操作?我覺得好像有一個非常簡單的方法來使用yield或Linq voodoo來做這件事情?

回答

2

像這樣的東西應該工作。如果你能控制課程,你可以直接使用IEnumerable

public class LinkedListEnumerable : IEnumerable<string> 
{ 
    LinkedList list; 
    public LinkedListEnumerable(LinkedList l) 
    { 
     this.list = l; 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     LinkedList l = list; 
     while(l != null) 
     { 
      yield return l.UniqueKey; 
      l = l.Next; 
     } 
    } 
} 

然後,您可以使用for-each循環遍歷LinkedListEnumerable

+0

啊,這是正確的。除非逐字回答問題,否則它應該是'yield return l'而不是'yield return l.UniqueKey'吧?所有這一切對於OP來說應該很容易就能把那部分弄清楚。 – 2010-07-18 03:06:34

0

這是你想要的嗎?

public class LinkedList 
{ 
    public string UniqueKey { get; set; } 
    public LinkedList LinkedList { get; set; } 

    public IEnumerable<LinkedList> GetAllNodes() 
    { 
     if (LinkedList != null) 
     { 
      yield return LinkedList; 
      foreach (var node in LinkedList.GetAllNodes()) 
       yield return node; 
     } 
    } 
} 
+2

這不是非常有效。對於包含100個項目的列表,您將創建100個枚舉器,最後一個項目在返回給調用者之前必須先通過所有項目。 – Guffa 2010-07-18 02:04:37

0

有沒有很好的LINQ方法標準.NET庫,允許一些優雅的LINQ巫術,但你可以從MoreLINQ項目中使用Generate方法和這樣寫:

Enumerable 
    .Generate(list, l => l.LinkedList) 
    .TakeWhile(l => l != null).Select(l => l.UniqueKey); 

它使用Generate到創建所有元素的「無限」列表 - 它實際上並不是無限的,因爲它是懶惰生成的,並且只要我們在最後找到null值(使用TakeWhile)就會停止使用它。然後我們使用Select來返回一個值序列(而不是鏈表節點)。

這實質上是一種很好的陳述方式,用於表達Matthew發佈的while循環解決方案(它應該具有大致相似的性能)。

編輯Generate方法是這樣的:

IEnumerable<T> Generate(T current, Func<T, T> generator) { 
    while(true) { 
    yield return current; 
    current = generator(current); 
    } 
} 
+0

這真棒,但不幸的是我不能添加任何其他庫到項目中。我將在未來的產品上使用它! – 2010-07-18 03:02:41

+0

@Geoffrey:您可以將'Generate'方法添加到您的項目中(這只是3行代碼)。 – 2010-07-18 03:12:38

相關問題