public static List <List <string> > anagrams(Bag bag, List <BagAnagrams> dictionary, uint recursion_level, bottom_of_main_loop bottom, done_pruning done_pruning_callback, found_anagram success_callback) { List <List <string> > rv = new List <List <string> >(); List <BagAnagrams> pruned = Prune(bag, dictionary, done_pruning_callback, recursion_level); int pruned_initial_size = pruned.Count; while (pruned.Count > 0) { BagAnagrams entry = pruned[0]; Bag this_bag = entry.bag; Bag diff = bag.Subtract(this_bag); if (diff != null) { if (diff.Empty()) { foreach (string w in entry.words) { List <string> loner = new List <string>(); loner.Add(w); rv.Add(loner); if (recursion_level == 0) { success_callback(loner); } } } else { List <List <string> > from_smaller = anagrams(diff, pruned, recursion_level + 1, bottom, done_pruning_callback, success_callback); List <List <string> > combined = Combine(entry.words, from_smaller); foreach (List <string> an in combined) { rv.Add(an); if (recursion_level == 0) { success_callback(an); } } } } pruned.RemoveAt(0); if (recursion_level == 0) { bottom(); } } return(rv); }
// Generate Anagrams from Word Dictionary and a list of letters private static List <BagAnagrams> LoadDictionary(string filename) { List <BagAnagrams> result = new List <BagAnagrams>(); using (StreamReader reader = File.OpenText(filename)) { try { string line = null; int linesRead = 0; Hashtable stringlists_by_bag = new Hashtable(); while ((line = reader.ReadLine()) != null) { line = line.ToLower(); Bag bag = new Bag(line); if (!stringlists_by_bag.ContainsKey(bag)) { List <string> l = new List <string>(); l.Add(line); stringlists_by_bag.Add(bag, l); } else { List <string> l = (List <string>)stringlists_by_bag[bag]; if (!l.Contains(line)) { l.Add(line); } } linesRead++; } result = new List <BagAnagrams>(); foreach (DictionaryEntry de in stringlists_by_bag) { result.Add(new BagAnagrams((Bag)de.Key, (List <string>)de.Value)); } result.Sort(); // Sort the list so that the biggest bags come first. // This might make more interesting anagrams appear first. BagAnagrams[] sort_me = new BagAnagrams[result.Count]; result.CopyTo(sort_me); Array.Sort(sort_me); result.Clear(); result.InsertRange(0, sort_me); } catch (Exception ex) { throw new Exception("Dictionary: " + ex.Message); } } return(result); }