@Vetka_in_code

Почему неправильно происходит сравнение?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
                Console.WriteLine("1 - Запись строки \n2 - Удаление строки");
                Console.Write("\nВыберите пункт: ");
                var buf = Console.ReadLine();
                if (
                    buf != new string(buf.Where(c => Char.IsLetterOrDigit(c) || Char.IsWhiteSpace(c)).ToArray()) 
                    || buf != "1" 
                    || buf != "3")
                {
                    Console.WriteLine("\nНе число или дробное число");
                }
                else
                {
                    switch (buf)
                    {
                        case "1":
                            Console.WriteLine("ОК");
                            break;
                        case "2":
                            Console.WriteLine("ОК");
                            break;
                    }
                }
        }
    }
}

Почему при написании "1" или "2" в консоль выводится "Не число или дробное число", хотя должно выводится "ОК"?
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
WNeZRoS
@WNeZRoS
Проблема в логике if'a. Если его сократить получается так:
if (buf != str || buf != "1" || buf != "3")

Подставим 1:
if ("1" != "1" || "1" != "1" || "1" != "2")
// считаем
if (false || false || true)
// итог
if (true)


В целом, этот if бесполезен, его функцию замечательно заменяет switch:
switch (buf)
{
   case "1":
       Console.WriteLine("ОК");
       break;
   case "2":
       Console.WriteLine("ОК");
       break;
   default:
      Console.WriteLine("\nНе число или дробное число");
      break;
}
Ответ написан
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
jfeJPeQ.png
...
new string(buf.Where(c => Char.IsLetterOrDigit(c) || Char.IsWhiteSpace(c)).ToArray())


код для размышления
using System;
using System.Linq;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("1 - Запись строки \n2 - Удаление строки");
            Console.Write("\nВыберите пункт: ");
            var buf = Console.ReadLine();
            var zzz = new string(buf.Where(c => Char.IsLetterOrDigit(c) || Char.IsWhiteSpace(c)).ToArray());
            Console.Write($"\n...! вот такую шнягу я сочинил {zzz}\n");
            Console.Write($"\n...! потом придумал такое условие {buf != zzz}\n");
            Console.Write($"\n...! общее условие {buf != zzz} || {buf != "1"} || {buf != "3"}\n");
            if (
                buf != zzz
                || buf != "1"
                || buf != "3")
            {
                Console.WriteLine("\nНе число или дробное число");
            }
            else
            {
                switch (buf)
                {
                    case "1":
                        Console.WriteLine("ОК");
                        break;
                    case "2":
                        Console.WriteLine("ОК");
                        break;
                }
            }
        }
    }
}
ps подправлено.. и думаю так будет нагляднее
pps а еще есть другие способы проверять ввод, к примеру https://docs.microsoft.com/ru-ru/dotnet/api/system...

upd код для размышления 2
using System;
using System.Linq;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("1 - Запись строки \n2 - Удаление строки");
            Console.Write("\nВыберите пункт: ");
            var buf = Console.ReadLine();
            if (!int.TryParse(buf, out var n))
                Console.WriteLine("\nНе число или дробное число");
            else
                switch (n)
                {
                    case 1:
                        Console.WriteLine("ОК");
                        break;
                    case 2:
                        Console.WriteLine("ОК");
                        break;
                    default:
                        Console.WriteLine($"... опять что то не предвиденное! ((..."
                            + $" или просто число неожиданное? {n}");
                        break;
                }
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы