c # Как проверить, является ли строка подстрокой элемента в массиве, а затем распечатать это? - PullRequest
0 голосов
/ 02 ноября 2018

Хорошо, чтобы сделать его более понятным, вот фрагмент кода:

string text1 = "Just a test.";
string text2 = "Another test.";
Console.Write("Search here: ");
string userInput = Console.ReadLine();

if (text1.Contains(userInput))
{
   Console.WriteLine(text1);
} 
else if (text2.Contains(userInput))
{ 
   Console.WriteLine(text2);
} 
else
{
   Console.WriteLine("No match.");
}

Теперь моя проблема заключается в следующем: я хочу иметь много этих строк text1 text2 и не хочу писать 100 строк операторов if. Так что я подумал, я должен поместить их в массив. Однако я просто не могу написать какой-либо код, который бы делал то, что я хочу:

  • Найти, если какой-либо элемент в массиве содержит userInput в качестве подстроки //array.Any?//, а затем полностью распечатать эти элементы.

Я хочу распечатать каждый элемент, который имеет его в качестве подстроки, поэтому, если userInput = "test", он должен распечатать как text1, так и text2, но если это "Другой", он должен распечатать только test2.

Считаете ли вы, что это возможно, и если да, то какой тип контейнера мне следует использовать, потому что массивы кажутся слишком ... ну, не динамическими для этого.

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Другим вариантом может быть использование метода IndexOf, который позволяет выполнять сравнение без учета регистра. Таким образом, пользователю не нужно знать, что «Другой» должен быть написан заглавными буквами.

И да, хранить ваши элементы в List<string> будет проще, чем в массиве.

Вот пример:

static void Main(string[] args)
{
    var bookTitles = new List<string>
    {
        "The Catcher in the Rye",
        "Pride and Prejudice",
        "The Great Gatsby",
        "Alice's Adventures in Wonderland",
        "Moby Dick",
        "Gulliver's Travels",
        "Hamlet",
        "The Canterbury Tales",
        "Catch-22",
        "The Adventures of Huckleberry Finn"
    };

    bool tryAgain = true;

    while (tryAgain)
    {
        Console.Write("Enter a search term: ");
        string searchTerm = Console.ReadLine();

        var results = bookTitles.Where(title =>
            title.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) > -1);

        if (results.Any())
        {
            Console.WriteLine("\nResults:");
            Console.WriteLine(" - " + string.Join("\n - ", results));
        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("\nNo matches found.");
            Console.ResetColor();
        }

        Console.Write("\nTry again? (y/n): ");
        if (Console.ReadKey().Key == ConsoleKey.N) tryAgain = false;
        Console.WriteLine("\n");
    }

    Console.Write("\nDone! Press any key to exit...");
    Console.ReadKey();
}

Пример вывода

enter image description here

0 голосов
/ 02 ноября 2018

Использование for loop с list является наиболее простым решением.

Примерно так:

List<string> texts = new List<string>(); // a list that holds all your strings
texts.Add("Just a test.");
texts.Add("Another test.");

Console.WriteLine("Search Here");
int num_matched = 0;
for (int i = 0; i < texts.Count; i++) {
    if (texts[i].Contains(userInput)) {
        Console.WriteLine("texts[i]");
        num_matched++;
    }
}
if (num_matched == 0) {
    Console.WriteLine("No match");
}
0 голосов
/ 02 ноября 2018

Массив можно использовать как механизм хранения для хранения искомых строк. Вам, вероятно, следует указать, нужно ли учитывать регистр или нет, потому что это может изменить ваши результаты.

Вы можете использовать LINQ, чтобы выполнить то, что вы хотите:

var possibleStrings = new string[] { "This is a test", "Another test" };
Console.WriteLine("Enter input: ");
var userInput = Console.ReadLine();
foreach (var match in possibleStrings.Where(ps => ps.Contains(userInput))
{
    Console.WriteLine(match);
}
0 голосов
/ 02 ноября 2018

Я думаю, вы ищете что-то подобное. Используйте List вместо массива. Затем вы можете использовать Linq's Where, чтобы отфильтровать список только до совпадающих.

var strings = new List<string> { "Just a test.", "Another test." };

Console.Write("Search here: ");
string userInput = Console.ReadLine();

var matching = strings.Where(s => s.Contains(userInput)).ToList();
if (matching.Count == 0) {
    Console.WriteLine("No match.");
} else {
    foreach (var match in matching) {
        Console.WriteLine(match);
    }
}

Обратите внимание, что Contains по умолчанию чувствительна к регистру. Если вы хотите, чтобы он не учитывал регистр, вы можете использовать s.IndexOf(userInput, StringComparison.CurrentCultureIgnoreCase) > -1

...