По предложению Фаринхи, но с использованием HashSet
Некоторые важные моменты: мы используем HashSet
, потому что в конце буквы могут иметь два состояния: обнаружено (присутствует в HS) или не обнаружено (не присутствует) Мы инициализируем передачу HashSet
в качестве параметра StringComparer.InvariantCultureIgnoreCase
, поскольку считаем, что L
и l
- это одно и то же. Чтобы использовать StringComparer.InvariantCultureIgnoreCase
, мы должны использовать HashSet<string>
(HS string
с) вместо HashSet<char>
(HS char
с). Так что при использовании discovered.Contains()
мы должны преобразовать c
char
в string
с ToString
static string ConvertWord(string word, HashSet<string> discovered)
{
StringBuilder sb = new StringBuilder(word.Length);
foreach (char c in word)
{
if (discovered.Contains(c.ToString()))
{
sb.Append(c);
}
else
{
sb.Append('_');
}
}
return sb.ToString();
}
HashSet<string> discovered = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
// The "secret" word
string word = "Hello world";
// How to add letters to the ones discovered
discovered.Add("l");
// The word ready to be shown
string convertWord = ConvertWord(word, discovered);
Мы могли бы сделать ConvertWord намного меньше символов, но на сегодня достаточно: -)
Хорошо ... Я приведу вам пример, в C # 4.0:
static string ConvertWord(string word, HashSet<string> discovered)
{
return string.Concat(word.Select(p => discovered.Contains(p.ToString()) ? p : '_'));
}