Проблема в том, что вы возвращаете введенную строку в конце цикла независимо от того, выполнена ли проверка.
Вы можете использовать логическое значение для проверки этой действительности.
Также вам не нужно анализировать всю строку, и вы можете разорвать внутренний цикл на первом недействительном символе.
Я переименовал строку в result
, чтобы использовать стандартный шаблон и быть более чистым.
Например:
static string GetUserString(string letters)
{
string result;
bool isValid;
do
{
Console.Write("Enter : ");
result = Console.ReadLine();
isValid = true;
foreach ( char c in result )
if ( letters.IndexOf(char.ToUpper(c)) == -1 )
{
isValid = false;
Console.WriteLine("Enter a valid input");
break;
}
}
while ( !isValid );
return result;
}