Одинарный вывод сообщения в цикле foreach - C#

356
31 августа 2017, 16:56

Есть некий код банкомата, где пользователю необходимо сначала ввести свой ид.

        Bankomat[] banks = new Bankomat[] { new Bankomat(146251, 1500, 15, "Петров Иван Иванович"),
                                            new Bankomat(146252, 3400, 80, "Сергеев Александр Сергеевич"),
                                            new Bankomat(146253, 710, 55, "Леонтьев Петр Евгеньевич")};
        Console.Write("Введите ваш id пожалуйста: ");
        int id = Convert.ToInt32(Console.ReadLine());
        string Y = "Y";
        int money = 0;
        string acc = "";
        foreach (Bankomat x in banks)
            if (id == x.id)
            {
               ..../*Тут не важно*/
            }
            else
            {
                Console.Write("Вы еще не зарегистрированы в нашей системе, обратитесь к оператору \n");
                break;
            }

Если ввести ид Петра Евгеньевича, то сначала 2 раза выведет, что я не зарегистрирован, а потом работа с банкоматом. Как нормально сделать?

Answer 1

Проще простого.

if(banks.Where(x=>x.Id==Id).FirstOrDefault()!=null)
{
 Console.Write("Вы еще не зарегистрированы в нашей системе, обратитесь к оператору \n");
}
Answer 2

В цикле у вас каждый объект поочередно проверяется на соответствие условию id == x.id, поэтому выводится 2 раза, что пользователь не зарегистрирован.

Чтобы исправить это нужно сначала проверить на соответствие все элементы массива, а затем уже выполнять нужный код. Для этого можно воспользоваться LINQ методом Any.

if (banks.Any(b => id == b.id))
{
   ..../*Тут не важно*/
}
else
{
    Console.Write("Вы еще не зарегистрированы в нашей системе, обратитесь к оператору \n");
}

Если вам нужно не только проверить наличие объекта в массиве, а еще и обратиться к его свойствам, то это делается так:

var bankomat = banks.FirstOrDefault(b => id == b.id);
if(bankomat != null)
{
    Console.WriteLine($"Здравствуйте {bankomat.name}");
}
else
{
    Console.Write("Вы еще не зарегистрированы в нашей системе, обратитесь к оператору \n");
}

P.S. Избавьтесь от foreach, в нем нет нужды.

Answer 3

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

Bankomat found = null;
foreach (Bankomat x in banks)
{
  if (id == x.id)
  {
    found = x;
    break;
  }
}
if (found != null)
{
  Console.WriteLine("Здравствуйте " + found.name);
  /* Тут не важно */
}
else
{
  Console.Write("Вы еще не зарегистрированы в нашей системе, обратитесь к оператору \n");
}
READ ALSO
Массив с ключами javascript

Массив с ключами javascript

Мне нужно сделать массив который хранит данные, знаю что можно сделать так

316
Возможно ли обращаться к woocommerce напрямую, без сервера и аутентификации?

Возможно ли обращаться к woocommerce напрямую, без сервера и аутентификации?

Здравствуйте, в woocommerce никак не могу найти способа работы с плагином без аутентификации (только get запросы нужны), возможно ли как-то напрямую...

326
Ajax запрос error

Ajax запрос error

Добрый деньСтолкнулся со следующей проблемой:

381