はGetPermutations()拡張機能を利用して、仕事関数である。ここelsewhere on stack overflow
public static List<string> GetAnagrams(string word)
{
HashSet<string> anagrams = new HashSet<string>();
char[] characters = word.ToCharArray();
foreach (IEnumerable<char> permutation in characters.GetPermutations())
{
anagrams.Add(new String(permutation.ToArray()));
}
return anagrams.OrderBy(x => x).ToList();
}
を見つけGetPermutations()拡張機能であり、それは他の必要な拡張です:ここで
public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> enumerable)
{
var array = enumerable as T[] ?? enumerable.ToArray();
var factorials = Enumerable.Range(0, array.Length + 1)
.Select(Factorial)
.ToArray();
for (var i = 0L; i < factorials[array.Length]; i++)
{
var sequence = GenerateSequence(i, array.Length - 1, factorials);
yield return GeneratePermutation(array, sequence);
}
}
private static IEnumerable<T> GeneratePermutation<T>(T[] array, IReadOnlyList<int> sequence)
{
var clone = (T[])array.Clone();
for (int i = 0; i < clone.Length - 1; i++)
{
Swap(ref clone[i], ref clone[i + sequence[i]]);
}
return clone;
}
private static int[] GenerateSequence(long number, int size, IReadOnlyList<long> factorials)
{
var sequence = new int[size];
for (var j = 0; j < sequence.Length; j++)
{
var facto = factorials[sequence.Length - j];
sequence[j] = (int)(number/facto);
number = (int)(number % facto);
}
return sequence;
}
static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
private static long Factorial(int n)
{
long result = n;
for (int i = 1; i < n; i++)
{
result = result * i;
}
return result;
}
}
はAです結果のスクリーンショット:
![GetAnagrams - abba](https://i.stack.imgur.com/G8gHW.png)
そして、最後に、完全なVisual StudioのソリューションのGitHubのリポジトリ:Github
Nugetパッケージのコンビナトリアルを使用してください:https://www.nuget.org/packages/Combinatorics/ - しかしそれらは言葉ではありませんが、実際の "アナグラム"が必要な場合は辞書も必要です –
あなたのコードを教えてください。 – Lennart
@ IanMercerさんのコメントに説得して、あなたの表記はちょっとです。 「単語」は、通常、文字の任意の組み合わせではなく、具体的には特定の言語(または任意の言語)で意味を持つ組み合わせのみです。質問をするもっと良い方法は、「入力文字を使って作ることができるすべての一意の文字列をリストする」ことです。 – Ehryk