2011-09-15 5 views
2

Ma structure de source est un dictionnaire Ressemblant:algorithme pour transformer une structure (fermeture transitive?)

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" }) 

Ou une liste de tuples ressemblant à:

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"); 

Ce sont les associations entre les éléments , peut-être mieux décrit comme un arbre d'héritage. Le moyen étant la classe la plus générale, A le plus spécialisé.

Ce que je suis à la recherche est un moyen de réorganiser les éléments à ressembler à ce qui suit:

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"); 

J'ai vraiment besoin d'aide pour y parvenir, j'ai eu quelques conseils dans la façon d'un transitif la fermeture, mais je peux vraiment m'en passer la tête. Toute aide serait vraiment très appréciée.

Répondre

3

De l'approche dictionnaire, que je suppose était censé être déclarée comme 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; 
      } 
     } 
    } 
} 

Puis:

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

Assurez-vous que vous n'avez pas encore cycles :)

+0

C'est exactement ce dont j'ai besoin, maintenant j'ai juste besoin de comprendre le code;) Merci beaucoup! – Oxymoron

Questions connexes