public static SCG.IEnumerable<SCG.IEnumerable<String>> AnagramClasses(SCG.IEnumerable<String> ss)
{
bool unseq = true;
IDictionary<TreeBag<char>, TreeSet<String>> classes;
if (unseq)
{
SCG.IEqualityComparer<TreeBag<char>> unsequencedTreeBagEqualityComparer
= UnsequencedCollectionEqualityComparer<TreeBag<char>, char>.Default;
classes = new HashDictionary<TreeBag<char>, TreeSet<String>>(unsequencedTreeBagEqualityComparer);
}
else
{
SCG.IEqualityComparer<TreeBag<char>> sequencedTreeBagEqualityComparer
= SequencedCollectionEqualityComparer<TreeBag<char>, char>.Default;
classes = new HashDictionary<TreeBag<char>, TreeSet<String>>(sequencedTreeBagEqualityComparer);
}
foreach (String s in ss)
{
TreeBag<char> anagram = AnagramClass(s);
TreeSet<String> anagramClass;
if (!classes.Find(anagram, out anagramClass))
classes[anagram] = anagramClass = new TreeSet<String>();
anagramClass.Add(s);
}
foreach (TreeSet<String> anagramClass in classes.Values)
if (anagramClass.Count > 1)
yield return anagramClass;
}