2015-04-13 1 views
3

J'ai Dictionary<string, HashSet<string>> que je voudrais passer et trouver toutes les combinaisons dans le HashSet possible sans répétitions. Par exemple (données fictives):Trouver les combinaisons de valeurs dans un dictionnaire de HashSet

Keys   Values (HashSet) 

"greeting"  "Hello" "Hi" "Hey" "Howdy" ... 
"Name"   "Tom" "Angel" "Edward" ... 
"question"  "how are you?" "can you help me?" "is everything okay?" ... 
    ...     ... 
    ...    .... 

Je voudrais que la sortie soit une sorte de collection avec chaque valeur:

"Hello Tom how are you?" 
"Hello Tom can you help me?" 
"Hello Tom is everything okay?" 
"Hello Angel how are you?" 
"Hello Angel can you help me?" 
"Hello Angel is everything okay?" 
"Hello Edward how are you?" 
... 

"Hi Tom how are you?" 
"Hi Tom can you help me?" 
"Hi Tom is everything okay?" 
"Hi Angel how are you?" 
... 

Je voudrais avoir cette aussi abstraite que possible où je peut ajouter autant de clés et de valeurs dans le hashset que je veux. J'ai essayé de le faire récursivement mais je ne suis pas trop fort avec ça et je ne peux pas trouver de cas de base ... Je pense que vous pouvez le faire avec linq mais je ne suis pas du tout familier avec linq.

La raison pour laquelle je me sers d'un Dictionary<string, HashSet<string>> est à cause de la façon dont je recueille les informations, donc je voudrais garder cette structure de données.

Merci!

+0

Recherche "permutations". – CodeCaster

+0

double possible de [Génération toutes les combinaisons possibles] (http://stackoverflow.com/questions/3093622/generating-all-possible-combinations) – CoderDennis

+0

@CoderDennis: ce n'est pas exactement ce que je veux, je veux le faire avec un dictionnaire de hashsets que je suis confus sur la façon d'aborder cela. Je voudrais aussi obtenir la première valeur de hashset de la première clé avec la première valeur de hashet de la deuxième clé et ainsi de suite jusqu'à ce que j'atteigne le dernier hashset puis le faire à nouveau sauf avec la deuxième valeur du hashet ... Je ne sais pas si cela a du sens – user3369494

Répondre

3

Compte tenu des données d'exemple fournis dans la question:

var data = new Dictionary<string, HashSet<string>> 
{ 
    {"greeting", new HashSet<string> {"Hello", "Hi", "Hey", "Howdy"}}, 
    {"Name", new HashSet<string> {"Tom", "Angel", "Edward"}}, 
    {"question", new HashSet<string> {"how are you?", "can you help me?", "is everything okay?"}} 
}; 

Sans clés arbitraires, voici un moyen facile de le faire avec LINQ:

var collection = from g in data["greeting"] 
    from n in data["Name"] 
    from q in data["question"] 
    select string.Format("{0} {1} {2}", g, n, q); 

En utilisant la méthode d'extension CartesianProduct de this answer wo ULD ressembler à ceci:

var collection = data.Select(x => x.Value).CartesianProduct().Select(x => x.Aggregate((a, b) => a + " " + b)); 

Dans les deux cas, voici la foreach que je l'habitude d'afficher la sortie dans une application de la console:

foreach (var line in collection) 
{ 
    Console.WriteLine(line); 
} 
+0

Ça marche vraiment bien! Je vous remercie! – user3369494

0

Une solution simple serait ...

Dictionary<string, HashSet<string>> test = new Dictionary<string, HashSet<string>>(); 
     test.Keys.ToList().ForEach(key => 
     { 
      test[key].ToList().ForEach(value => Console.WriteLine("key key:" + "value:" + value)); 
     }); 
+0

ce n'est pas exactement ce que je veux, je ne veux pas simplement imprimer les valeurs du hashset associé à la clé, je veux imprimer toutes les combinaisons des valeurs du hashset sur toutes les clés. Comme la première valeur de hashset de la première clé avec la première valeur de hashet de la deuxième clé, etc. – user3369494

+0

Vous devriez fournir plus de code. Vous devez définir une liste avec les valeurs et l'ordre dans lesquels vous voulez permuter. – weismat