Необходима помощь с кодом по задаче со строками(C#)

Дана следующая задача: Дана строка, в которой содержится осмысленной текстовое сообщение. Слова сообщения разделяется пробелами и знаками препинания. Удалить из сообщения все слова, содержащие данный символ (без учета регистра)

Ниже приведён код, в котором компилятор видит ошибку в цикле foreach, которую я не до конца понимаю как решить, а именно он не может преобразовать char(понятия не имею где он его увидел) в string.

Что конкретно требуется:

  • подсказать как решить ошибку с циклом

  • подсказать как модифицировать код для удаления слова полностью, а не буквы(на случай если я что-то напутал и код удаляет только букву)

Console.WriteLine("Программа, удаляющая слова, с заданной буквой.");
Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
string words = Console.ReadLine();
StringBuilder tagsSB = new StringBuilder(text);
foreach (string word in words) 
{
    tagsSB.Replace(word, "");
}

Console.WriteLine(tagsSB.ToString());

Console.WriteLine();
Console.Write("Нажмите Enter для выхода.");
Console.ReadLine();

Ответы (2 шт):

Автор решения: Алексей Шиманский

Если применять цикл foreach к строке, то он будет пробегаться по каждому символу строки, то есть по char и соответственно тип каждого элемента должен быть char. Конструкцией string word вы пытаетесь принудить конвертировать символ в строку, а он не может.

Получается, либо надо писать char word, чтобы всё же пробегаться по символам, как и требуется для строки, либо (т.к. задача всё же в пробегании по словам), нужно, чтобы words был не строкой, а массивом строк. Т.е. либо разбить words предварительно на слова, например, с помощью функции Split, записать этот массив в переменную и уже эту переменную подставить в цикл. Либо прям сразу в цикле написать не words, а words.Split(НУЖНОЕ ВЫРАЖЕНИЕ)

→ Ссылка
Автор решения: aepot

string это по сути массив char[]. Поэтому по символам строки можно пробежаться циклом или взять символ по индексу.

Чтобы решить задачу, words должен быть массивом слов (строк) string[].

Решение будет выглядеть примерно так

Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
char letter = Console.ReadLine()[0]; // первый символ строки

StringBuilder tagsSB = new StringBuilder(text);
string[] words = text.Split();
foreach (string word in words) 
{
    if (word.Contains(letter, StringComparison.CurrentCultureIgnoreCase))
    {
        tagsSB.Replace(word, "");
    }
}

Console.WriteLine(tagsSB);

Это если опираться на ваш код как основу. Но есть проблема, будут оставаться парные пробелы на местах удаления строк, так как слово удаляется, а пробел рядом с ним - нет.

Но я бы написал через список как-то так

Console.Write("Введите строку: ");
string text = Console.ReadLine();
Console.Write("Введите букву, слова с которой нужно удалить:");
char letter = Console.ReadLine()[0]; // первый символ строки

string[] words = text.Split();
List<string> newWords = new();
foreach (string word in words) 
{
    if (!word.Contains(letter, StringComparison.CurrentCultureIgnoreCase))
    {
        newWords.Add(word);
    }
}

string result = string.Join(' ', newWords);
Console.WriteLine(result);
→ Ссылка