2015-07-20 22 views
0

下面是一個例子角色<>對於分層數據結構

class A 
{ 
    public string Text = ""; 
    public IEnumerable<A> Children = new List<A>(); 
} 
class B 
{ 
    public string Text; 
    public IEnumerable<B> Children = new List<B>(); 
} 

static void Main(string[] args) 
{ 
    // test 
    var a = new A[] 
    { 
     new A() { Text = "1", Children = new A[] 
     { 
      new A() { Text = "11"}, 
      new A() {Text = "12"}, 
     }}, 
     new A() { Text = "2", Children = new A[] 
     { 
      new A() {Text = "21", Children = new A[] 
      { 
       new A() {Text = "211"}, 
       new A() {Text = "212"}, 
      }}, 
      new A() {Text = "22"}, 
     }}, 
    }; 

    B[] b = a ...; // convert a to b type 

} 

我原來的問題是階層數據A在模型,其具有要被顯示在視圖中,因此我要創建在視圖模型B類型與INotifyPropertyChanged等。對於分層數據,從A轉換爲B似乎比簡單的linq Cast<>更復雜。

如果有人要嘗試的代碼,然後here是不錯討人喜歡的功能,可以像這樣使用:

foreach (var item in b.Flatten(o => o.Children).OrderBy(o => o.Text)) 
    Console.WriteLine(item.Text); 
+0

你要自我接聽,不是更新的問題相匹配的答案嗎?不確定你在尋找什麼樣的幫助。假設你已經有了遞歸的代碼,那麼用你擁有的以及爲什麼它不適合你更新問題會很好。 –

+0

@AlexeiLevenkov,你說的遞歸?出於某些原因,我無法做到這一點,最近的想法是先將'a',然後'Cast <>'拉扁,然後解開。我堅持不放鬆。也許我太過於複雜了?如果這聽起來很容易,你可以請發表一個答案嗎? – Sinatr

+0

Sinatr,由StripligWarior(downvoted出於某種奇怪的原因)的答案完美的工作,可能是最短的代碼,你需要寫。 –

回答

3

使用遞歸函數,可以在A翻譯成B

B BFromA(A a) { 
    return new B { Text = a.Text, Children = a.Children.Select(BFromA).ToList() }; 
} 

用法:

B[] b = a.Select(BFromA).ToArray(); // convert a to b type 
+0

@Sinatr代碼工作得很好。將方法名稱(「方法組」)作爲委託沒有任何特殊之處。 –

+1

Complete sample - http://ideone.com/PZN9V9 –

+0

@Sinatr:'.Select()'是'System.Linq'命名空間中的擴展方法。您需要將'使用System.Linq;'添加到C#文件的頂部,就像Alexei在他的示例中所做的那樣。 LINQ擴展方法被大量使用,我們傾向於認爲您將包含這個名稱空間。 – StriplingWarrior