Я пытаюсь обрезать следующие строки в списке:
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);
}
}
}
}
Надеюсь, кто-нибудь может помочь мне с этой проблемой. Заранее спасибо.
Если бы вы могли объяснить, как может быть установлен выделенный текст, вы могли бы получить ответ, в противном случае большая часть кода не имеет значения. Честно говоря, создайте класс, который представляет рецепт вместе с его ингредиентами, размерами и т. д.
Вам нужно установить приоритет для фильтрации «ИНГРЕДИЕНТЫ АНАНАСОВОГО ПИРОГА» только тогда, когда «АНАНАСОВЫЙ ПИРОГ» ... поэтому я рекомендую сначала проверить, является ли выбранный текст «ИНГРЕДИЕНТЫ АНАНАСОВОГО ПИРОГА», а если нет, то вы знаете, что «АНАНАСОВЫЙ ПИРОГ…» — целевой предмет.
Это один из способов:
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);
}
}
}
Это называется не обрезкой, а удалением и/или заменой... Также не будет работать здесь, это будет включать все. Кроме того, то, что вы показываете, не является реальным случаем, вы знаете, какие предметы вам нужны, поэтому добавьте их в этот список...