Обрезать только строки, содержащие определенные слова, и добавить их в список строк в С#

Я пытаюсь обрезать следующие строки в списке:

myList1.Add("PINEAPPLE PIE 1/2"); // if text PINEAPPLE PIE is selected only display 1/2
myList1.Add("PINEAPPLE PIE 1/4"); // if text PINEAPPLE PIE is selected only display 1/4
myList1.Add("PINEAPPLE PIE INGREDIENTS SUGAR"); // if text PINEAPPLE PIE INGREDIENTS is selected only display SUGAR
myList1.Add("PINEAPPLE PIE INGREDIENTS BUTTER"); // if text PINEAPPLE PIE INGREDIENTS is selected only display BUTTER

Как комментарии в коде указывают, выбран ли текст АНАНАСОВЫЙ ПИРОГ, я хочу отображать только 1/2 и 1/4 на терминале, но я получаю следующий вывод, потому что две другие строки в списке также содержат текст АНАНАСОВЫЙ ПИРОГ:

1/2
1/4
INGREDIENTS SUGAR
INGREDIENTS BUTTER

Как я могу получить следующий вывод?:

1/2
1/4

Вот мой пример кода:

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> myList1 = new List<string>();
            List<string> myList2 = new List<string>();

            myList1.Add("PINEAPPLE PIE 1/2"); // if text PINEAPPLE PIE is selected only display 1/2
            myList1.Add("PINEAPPLE PIE 1/4"); // if text PINEAPPLE PIE is selected only display 1/4
            myList1.Add("PINEAPPLE PIE INGREDIENTS SUGAR"); // if text PINEAPPLE PIE INGREDIENTS is selected only display SUGAR
            myList1.Add("PINEAPPLE PIE INGREDIENTS BUTTER"); // if text PINEAPPLE PIE INGREDIENTS is selected only display BUTTER

            string selectedText = "PINEAPPLE PIE";

            foreach (string item in myList1)
            {
                if (item.Contains(selectedText))
                {
                    string tmp = item.Replace(selectedText, String.Empty);
                    myList2.Add(tmp.Trim()); // Expecting to add "1/2" & "1/4" only, NOT "INGREDIENTS SUGAR" & "INGREDIENTS BUTTER"
                }
            }
            // Display the contents of myList2
            foreach (string item in myList2)
            {
                Console.WriteLine(item);
            }
        }
    }
}

Надеюсь, кто-нибудь может помочь мне с этой проблемой. Заранее спасибо.

Это называется не обрезкой, а удалением и/или заменой... Также не будет работать здесь, это будет включать все. Кроме того, то, что вы показываете, не является реальным случаем, вы знаете, какие предметы вам нужны, поэтому добавьте их в этот список...

Trevor 13.12.2020 06:01

Если бы вы могли объяснить, как может быть установлен выделенный текст, вы могли бы получить ответ, в противном случае большая часть кода не имеет значения. Честно говоря, создайте класс, который представляет рецепт вместе с его ингредиентами, размерами и т. д.

Trevor 13.12.2020 06:07

Вам нужно установить приоритет для фильтрации «ИНГРЕДИЕНТЫ АНАНАСОВОГО ПИРОГА» только тогда, когда «АНАНАСОВЫЙ ПИРОГ» ... поэтому я рекомендую сначала проверить, является ли выбранный текст «ИНГРЕДИЕНТЫ АНАНАСОВОГО ПИРОГА», а если нет, то вы знаете, что «АНАНАСОВЫЙ ПИРОГ…» — целевой предмет.

Dash 13.12.2020 06:10
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это один из способов:

   var myList = new List<string>()
        {
            "PINEAPPLE PIE 1/2",
            "PINEAPPLE PIE 1/4",
            "PINEAPPLE PIE INGREDIENTS SUGAR",
            "PINEAPPLE PIE INGREDIENTS BUTTER"
        };


        // This Regex (Regular expressions) pattern matches the fraction (single digits, like 1/2)
        // OR the word INGREDIENTS followed by any word
        var pattern = @"\d/\d|INGREDIENTS \w*";

        // Use Linq to create a new list
        var result = myList
            .Select(i =>
                // Use Regex to extract something like this: 1/2 or something like this: INGREDIENTS SUGAR
                Regex.Match(i, pattern, RegexOptions.IgnoreCase)
                    .Value // <- I am assuming that ingoring case is needed
                    // Remove the word INGREDIENTES from the result.
                    .Replace("INGREDIENTS ", ""))
            // Convert this result to a list
            .ToList();

        // See if the result is correct
        foreach (var extractedText in result)
        {
            Console.WriteLine(extractedText);
            // OUTPUT:
            // 1/2
            // 1/4
            // SUGAR
            // BUTTER
        }

        /*
         * var pattern = @"\d/\d|INGREDIENTS \w*";
         * \d: any digit
         * /: followed by slash
         * \d: any digit
         * |: OR
         * INGREDIENTES: The word INGREDIENTS
         * \w*: Any word character any times, this ends in case there is another word because space is not
         * a word character, so, for example, this: INGREDIENTS SUGAR JUST A LITTLE, Will match this: INGREDIENTS SUGAR
         */
    }

Язык регулярных выражений

Ответ принят как подходящий

Ответ прост: вам нужен способ различать элементы списка, которые вы хотите добавить, и те, которые вы не хотите добавлять.

В вашем случае это "INGREDIENTS", поэтому просто проверьте, является ли он частью строки или нет:

public static void Main(string[] args)
{
    List<string> myList1 = new List<string>();
    List<string> myList2 = new List<string>();
    myList1.Add("PINEAPPLE PIE 1/2"); // if text PINEAPPLE PIE is selected only display 1/2
    myList1.Add("PINEAPPLE PIE 1/4"); // if text PINEAPPLE PIE is selected only display 1/4
    myList1.Add("PINEAPPLE PIE INGREDIENTS SUGAR"); // if text PINEAPPLE PIE INGREDIENTS is selected only display SUGAR
    myList1.Add("PINEAPPLE PIE INGREDIENTS BUTTER"); // if text PINEAPPLE PIE INGREDIENTS is selected only display BUTTER

    string selectedText = "PINEAPPLE PIE";
    string selectedText2 = "PINEAPPLE PIE INGREDIENTS";
    foreach (string item in myList1)
    {
        if (item.Contains(selectedText) && !item.Contains(selectedText2))
        {
            string tmp = item.Replace(selectedText, String.Empty);
            myList2.Add(tmp.Trim()); // Expecting to add "1/2" & "1/4" only, NOT "INGREDIENTS SUGAR" & "INGREDIENTS BUTTER"
        }
    }
    // Display the contents of myList2
    foreach (string item in myList2)
    {
        Console.WriteLine(item);
    }
}

Один из способов сделать это — различать совпадения на основе кратчайшей совпадающей строки (т. е. длины строки).

Если это так, это был бы один из способов сделать это:

using System.Collections.Generic;
using System;

public class Program
{
    public static void Main()
    {
        List<string> myList1 = new List<string>();
        List<string> myList2 = new List<string>();
        myList1.Add("PINEAPPLE PIE 1/2"); // if text PINEAPPLE PIE is selected only display 1/2
        myList1.Add("PINEAPPLE PIE 1/4"); // if text PINEAPPLE PIE is selected only display 1/4
        myList1.Add("PINEAPPLE PIE INGREDIENTS SUGAR"); // if text PINEAPPLE PIE INGREDIENTS is selected only display SUGAR
        myList1.Add("PINEAPPLE PIE INGREDIENTS BUTTER"); // if text PINEAPPLE PIE INGREDIENTS is selected only display BUTTER
        string selectedText = "PINEAPPLE PIE";
        string shortestMatchingString = "";
        foreach (string item in myList1)
        {
            if (item.Contains(selectedText))
            {
                if (shortestMatchingString.Length == 0)
                { // is this the first match we make?
                    shortestMatchingString = item;
                    myList2.Add(item);
                }
                else
                {
                    if (item.Length < shortestMatchingString.Length)
                    { // is this match shorter in length than the prev. shortest match found
                        shortestMatchingString = item;
                        myList2.Clear();
                        myList2.Add(item);
                    }
                    else if (item.Length == shortestMatchingString.Length)
                    { // this is the 2nd match that is the same in length
                        myList2.Add(item);
                    }
                }
            }
        }

        // Display the contents of myList2
        foreach (string item in myList2) // here, you can trim the selectedText from each item
        {
            Console.WriteLine(item);
        }
    }
}

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