Если я правильно вас понимаю, этот вопрос сводится к следующему:
"Как определить, содержит ли одно предложение все слова другого предложения, игнорируя определенные символы"
Самый простой способ, которым я могу придумать, это сделать:
- Удалить специальные символы как из исходной строки, так и из строки поиска
- Получить все "слова" изкаждый (разбить их на пробел)
- Проверить, содержатся ли все слова в строке поиска в списке слов из исходной строки
Если это так, тоВот несколько вспомогательных методов, которые могут сделать это:
public static bool ContainsWords(string source, string search,
List<char> charsToIgnore = null, bool ignoreCase = true)
{
var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
var sourceWords = GetWords(RemoveChars(source, charsToIgnore));
var searchWords = GetWords(RemoveChars(search, charsToIgnore));
return searchWords.All(searchWord => sourceWords.Contains(searchWord, comparer));
}
public static string RemoveChars(string input, List<char> charsToRemove)
{
// If input or charsToIgnore are null or empty, return input
if (string.IsNullOrEmpty(input) || charsToRemove?.Any() != true) return input;
return string.Concat(input.Where(chr => !charsToRemove.Contains(chr)));
}
public static List<string> GetWords(string input)
{
return input?.Split(' ').ToList() ?? new List<string>();
}
При использовании это может выглядеть следующим образом:
public static void Main(string[] args)
{
var tracks = new List<string>
{
"Thank You, Next.",
"Sweet But Psycho (One of Six Hardstyle Remix)",
};
// Note that this prevents someone from searching
// for all titles that have a comma in the name
var charsToIgnore = new List<char>
{
',', '.', '!', ';', ':', '(', ')'
};
while (true)
{
Console.Write("Enter a parital title to search for: ");
var search = Console.ReadLine();
var matches = tracks.Where(track => ContainsWords(track, search, charsToIgnore));
Console.WriteLine($"Matches found: {0}",
matches.Any() ? string.Join(", ", matches) : "[None]");
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
Вывод
Обратите внимание, что это не позволит пользователям искать все заголовки, содержащие один из символов в нашем списке игнорирования, например запятую или скобку: