Удалить слова, если все они находятся в списке стоп-слов

У меня есть массив слов, он может содержать одно слово или несколько. В случае одного слова его легко удалить, но когда я выбираю удалить несколько слов, если они все находятся в списке стоп-слов, мне трудно понять это. Я предпочитаю решать это с помощью 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"};

Спасибо,

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

используйте метод 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. Поэтому вторую строку результата удалять не следует.

Да, вы правы насчет них/тогда. Затем я добавил в массив стоп-слов.

Khalid Almannai 14.11.2022 05:51

Хорошее описание. +1

user585968 14.11.2022 06:59

Другие вопросы по теме