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

#c# #list

#c# #Список

Вопрос:

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

 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
 

Как и в комментариях в коде, указывается, выбран ли текст PINEAPPLE PIE, я хочу отображать только 1/2 и 1/4 в терминале, но я получаю следующий вывод, потому что две другие строки в списке также содержат текст PINEAPPLE PIE:

 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" amp; "1/4" only, NOT "INGREDIENTS SUGAR" amp; "INGREDIENTS BUTTER"
                }
            }
            // Display the contents of myList2
            foreach (string item in myList2)
            {
                Console.WriteLine(item);
            }
        }
    }
}
 

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

Комментарии:

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

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

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

Ответ №1:

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

В вашем случае "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) amp;amp; !item.Contains(selectedText2))
        {
            string tmp = item.Replace(selectedText, String.Empty);
            myList2.Add(tmp.Trim()); // Expecting to add "1/2" amp; "1/4" only, NOT "INGREDIENTS SUGAR" amp; "INGREDIENTS BUTTER"
        }
    }
    // Display the contents of myList2
    foreach (string item in myList2)
    {
        Console.WriteLine(item);
    }
}
 

Ответ №2:

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

    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
         */
    }
 

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

Ответ №3:

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

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

 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);
        }
    }
}