2011-09-15 18 views
2

我的源結構或者是一個字典看起來像:算法變換的結構(傳遞閉包?)

new Dictionary<string, string>(); 
dic.Add("Dinges", new List<String>() { "A", "B" }); 
dic.Add("Facebook", new List<String>() { "Dinges" }); 
dic.Add("SocialMedia", new List<String>() { "FaceBook" }); 
dic.Add("Medium", new List<String>() { "SocialMedia" }) 

或元組的列表看起來像:

new List<Tuple<String, String>>(); 
list.Add(Tuple.Create("Dinges", "A"); 
list.Add(Tuple.Create("Dinges", "B"); 
list.Add(Tuple.Create("Facebook", "Dinges"); 
list.Add(Tuple.Create("SocialMedia", "Facebook"); 
list.Add(Tuple.Create("Medium", "SocialMedia"); 

這些項目之間的關聯,也許最好被描述爲一個繼承樹。中等是最普遍的類,A是最專業的。

我正在尋找的是重新排列物品,看起來像一個方式如下:

new List<Tuple<String, String>>(); 
list.Add(Tuple.Create("Dinges", "A"); 
list.Add(Tuple.Create("Dinges", "B"); 
list.Add(Tuple.Create("Facebook", "Dinges"); 
list.Add(Tuple.Create("Facebook", "A"); 
list.Add(Tuple.Create("Facebook", "B"); 
list.Add(Tuple.Create("SocialMedia", "A"); 
list.Add(Tuple.Create("SocialMedia", "B"); 
list.Add(Tuple.Create("SocialMedia", "Dinges"); 
list.Add(Tuple.Create("SocialMedia", "Facebook"); 
list.Add(Tuple.Create("Medium", "A"); 
list.Add(Tuple.Create("Medium", "B"); 
list.Add(Tuple.Create("Medium", "Dinges"); 
list.Add(Tuple.Create("Medium", "FaceBook"); 
list.Add(Tuple.Create("Medium", "SocialMedia"); 

我真的需要一些幫助實現這一點,我有一個傳遞的一些提示關閉,但我真的可以;我的頭圍繞它。任何幫助將非常感激。

回答

3

從字典方法,我以爲是爲了被聲明爲Dictionary<string, List<string>>

private static IEnumerable<string> TransitiveValues(string name, 
        Dictionary<string, List<string>> lookup) 
{ 
    yield return name; 
    List<string> children; 
    if (lookup.TryGetValue(name, out children)) 
    { 
     foreach (string child in children) 
     { 
      foreach (string value in TransitiveValues(child, lookup)) 
      { 
       yield return value; 
      } 
     } 
    } 
} 

然後:

var query = from name in dictionary.Keys 
      from value in TransitiveValues(name, dictionary) 
      select Tuple.Create(name, value); 
var list = query.ToList(); 

只要確保你沒有任何週期:)

+0

這正是我所需要的,現在我只需要把代碼弄清楚;)非常感謝! – Oxymoron