Другие показали ответы, используя LINQ. Это продвинутая концепция программирования. При изучении C# вы можете сделать это без LINQ. Ниже приведены два возможных алгоритма.
Проблема в вашем коде состоит в том, что (в примере с 2 "aka") вы дважды учитываете первое "a" во втором "aka" и втором "a" также.
С "aka" и "akb" это даст вам правильный счет, потому что он найдет каждую букву первого слова во втором один раз. И это тоже неправильно.
Одним из решений будет удаление каждой буквы из второго слова, когда оно будет найдено. Мы делаем это просто, заменяя букву символом NUL:
private static bool IsAnagramRemove(string s, string t)
{
if (s.Length != t.Length) {
return false;
}
// Convert second word to char array, so we can remove matched letters.
char[] tChar = t.ToCharArray();
int count = 0;
for (int i = 0; i < s.Length; i++) {
for (int j = 0; j < tChar.Length; j++) {
if (s[i] == tChar[j]) {
tChar[j] = (char)0; // Remove (well.., replace by 0).
count++;
break; // Leave the inner loop.
}
}
}
return count == s.Length;
}
Обратите внимание, что вы можете заменить это
if (compteur == index)
{
return true;
}
else
{
return false;
}
этим
return compteur == index;
Поскольку выражение compteur == index
возвращает логическое значение, представляющее результат сравнения.
Другая возможность состоит в том, чтобы сначала отсортировать буквы в обоих словах, чтобы затем можно было сравнивать буквы в одном и том же позиция в обоих словах:
private static bool IsAnagramSort(string s, string t)
{
if (s.Length != t.Length) {
return false;
}
char[] a = s.ToCharArray();
char[] b = t.ToCharArray();
Array.Sort(a);
Array.Sort(b);
for (int i = 0; i < a.Length; i++) {
if (a[i] != b[i]) {
return false;
}
}
return true;
}
Не нужно здесь считать. Если вы достигнете конца l oop, это значит, что мы нашли анаграмму.