У меня есть массив слов, он может содержать одно слово или несколько. В случае одного слова его легко удалить, но когда я выбираю удалить несколько слов, если они все находятся в списке стоп-слов, мне трудно понять это. Я предпочитаю решать это с помощью LINQ.
Представьте, у меня есть этот массив строк
then use
then he
the image
and the
should be in
should be written
Я хочу получить только
then use
the image
should be written
Таким образом, строки, в которых все слова находятся в стоп-словах, должны быть удалены, а строки, содержащие смешанные слова, должны быть сохранены.
Мой массив стоп-слов
string[] stopWords = {"a", "an", "x", "y", "z", "this", "the", "me", "you", "our", "we", "I", "them", "then", "ours", "more", "will", "he", "she", "should", "be", "at", "on", "in", "has", "have", "and"};
Спасибо,
используйте метод Intersect следующим образом:
foreach (string word in WordsList)
{
List<string> splitData = word.Split(new string[] { " "}, StringSplitOptions.RemoveEmptyEntries).ToList();
bool allOfWordsIsInStopWords = splitData.Intersect(stopWords).Count() == splitData.Count();
}
Согласно этому первоначальному описанию проблемы:
У меня есть массив слов, он может содержать одно слово или несколько. В случае одного слова его легко удалить, но когда я выбираю удалить несколько слов, если они ВСЕ в списке стоп-слов, мне трудно понять это. Я предпочитаю решать это с помощью LINQ.
Следующий код разрешает предложения, выделенные жирным шрифтом.
using System.Text.RegularExpressions;
string[] stopWords = { "a", "an", "x", "y", "z", "this", "the", "me", "you", "our", "we", "I", "them", "ours", "more", "will", "he", "she", "should", "be", "at", "on", "in", "has", "have", "and" };
string[] inputStrings = { "then use", "then he", "the image", "and the", "should be in", "should be written" };
var wordSeparatorPattern = new Regex(@"\s+");
var outputStrings = inputStrings.Where((words) =>
{
return wordSeparatorPattern.Split(words).Any((word) =>
{
return !stopWords.Contains(word);
});
});
foreach (var item in outputStrings)
{
Console.WriteLine(item);
}
Одним из способов решения этой проблемы было бы сделать следующее:
string[] stopWords = { "a", "an", "x", "y", "z", "this", "the", "me", "you", "our", "we", "I", "them", "ours", "more", "will", "he", "she", "should", "be", "at", "on", "in", "has", "have", "and" };
string input = """"
then use
then he
the image
and the
should be in
should be written
"""";
var array = input.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var filteredArray = array.Where(x => x.Split(' ').Any(y => !stopWords.Contains(y))).ToList();
var result = string.Join(Environment.NewLine, filteredArray);
Console.WriteLine(result);
Первые 2 строки предназначены только для настройки данных.
Третья строка преобразует строку в массив строк путем разделения на символ новой строки. (Environment.NewLine
гарантирует, что код работает правильно и в Linux.)
Четвертая строка обрабатывает каждую строку, разбивая строку на пробел (что дает нам отдельные слова), а затем проверяет, есть ли какое-либо слово, которое не существует в списке stopWords
. Если какое-либо из слов не существует, то выполняется условие Where
и вся строка возвращается в filteredArray
.
Пятая строка просто объединяет все отдельные строки, чтобы сформировать окончательную строку result
.
Результат должен выглядеть примерно так:
then use
then he
the image
should be written
Обратите внимание, что в вашем списке stopWords
у вас есть слово them
, но не then
. Поэтому вторую строку результата удалять не следует.
Хорошее описание. +1
Да, вы правы насчет них/тогда. Затем я добавил в массив стоп-слов.