У меня есть такой код, он запрашивает ввод для имени 1-5 и адреса 1-5, я хочу, чтобы он обнаруживал имя из строки, а в разделе имени поиска он будет запрашивать имя из пользовательского ввода и выводить адрес что было ранее введено.

string[,] input = new string[5, 2];
var Name = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

for (int a = 0; a < input.GetLength(0); ++a)
{
    while (true)
    {
        Console.Write($"Name {a + 1} : ");
        input[a, 0] = Console.ReadLine();

        if (Name.Add(input[a, 0]))
            break;

        Console.WriteLine("Name is already added! please input a different name");
    }

    Console.Write($"Address {a + 1} : ");
    input[a, 1] = Console.ReadLine();
}

while(true)
{
    Console.Write("\n==> Search Name : ");
    string nameSearch = Console.ReadLine();

    if (Name.Contains(nameSearch)) 
    { 
        Console.Write($"Address : {input[1, 1]}"); 
    }
    else 
    { 
        Console.Write("Name cannot be found!");
    }
}

Мне уже удалось сделать такой вывод

Имя 1: пример имени а

Адрес 1: пока не может быть закодирован

Имя 2: пример имени b

Адрес 2: пока не может быть закодирован

Имя 3: пример имени c

Адрес 3: пока не может быть закодирован

Имя 4: пример имени d

Адрес 4: пока не может быть закодирован

Имя 5: пример имени e

Адрес 5: пока не может быть закодирован

И я хочу, чтобы это вывело:

Имя 1: пример имени а

Адрес 1: адрес 1 ввод от пользователя . например: манго номер 7

Имя 2: пример имени b

Адрес 2: адрес 2 ввод от пользователя . Пример: Ананас номер 12.

Имя 3: пример имени c

Адрес 3: адрес 3 ввод от пользователя . пример: Черника номер 44

Имя 4: пример имени d

Адрес 4: адрес 4 ввод от пользователя . пример: Яблоко номер 3

Имя 5: пример имени e

Адрес 5: адрес 1 ввод от пользователя . пример: Вишня номер 5

c#
0
krazyne 27 Ноя 2021 в 17:54

1 ответ

Лучший ответ

Подойдет простой линейный поиск.

while(true)
{
    Console.Write("\n==> Search Name : ");
    string nameSearch = Console.ReadLine();

    bool found = false;
    for(int i = 0; i < input.GetLength(0); i++)
    { 
        if (input[i, 0] == nameSearch) {
            Console.Write($"Address : {input[i, 1]}");
            found = true;
            break;
        }
    }
    if (!found)
    { 
        Console.Write("Name cannot be found!");
    }
}

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

while(true)
{
    Console.Write("\n==> Search Name : ");
    string nameSearch = Console.ReadLine();

    if (Name.Contains(nameSearch))
    {
        for(int i = 0; i < input.GetLength(0); i++)
        { 
            if (input[i, 0] == nameSearch) {
                Console.Write($"Address : {input[i, 1]}");
                break;
            }
        }
    }
    else
    { 
        Console.Write("Name cannot be found!");
    }
}

Или вы можете избавиться от хэш-карты и 2-го массива и использовать Dictionary<string, string>, где ключ - это имя, а значение - адрес.

var data = new Dictionary<string, string>();
for (int a = 0; a < 5; ++a)
{
    string name;
    while (true)
    {
        Console.Write($"Name {a + 1} : ");
        name = Console.ReadLine();
        if (!data.ContainsKey(name)) {
            break;
        }
        Console.WriteLine("Name is already added! please input a different name");
    }
    Console.Write($"Address {a + 1} : ");
    var address = Console.ReadLine();
    data[name] = address;
}
while(true)
{
    Console.Write("\n==> Search Name : ");
    string nameSearch = Console.ReadLine();

    if (data.ContainsKey(nameSearch) )
    { 
        Console.Write($"Address : {data[nameSearch]}"); 
    }
    else 
    { 
        Console.Write("Name cannot be found!");
    }
}
0
Johnny Mopp 27 Ноя 2021 в 18:19