Сравнение символов в строке со списком разрешенных - C#

Узнай цену своей работы

Формулировка задачи:

Вводим слово. Может содержать всякие непечатаемые символы, в т.ч. и из других кодировок. Задача: Вернуть false, если хоть один из символов не входит в список разрешенных. Застопорился на такой вроде и простой задаче. v.2 я сделал на регулярке. Не получилось. Регулярка пропускает символы из других кодировок, например '\x2593' v.3 попытался внести список букв в список типа char. При сравнении выдает ошибку "Не могу преобразовать char в System.Predicate<char>". Помогите, пожалуйста, найти наиболее оптимальный способ для практического использования. А также допилить приведенные примеры в учебных целях.
using System;
using System.Text;
using System.Collections.Generic;
 
namespace BadNames3
{
    public class Class1
    {
        List<char> Good_Symb = new List<char>();
        const string mask_normal = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789абвгдежзийклмнопрстуфхцчшщьыъэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯҐЁЄЇіґёєї";
        const string mask_special = "'‘’!\"#$%&()*+,-./:;<=>?@[\\]^`{|}~©®№§ ";
 
        void Main()
        {
            Console.WriteLine(CheckName("SomeBadName"));
            Console.Read();
        }
 
        public bool CheckName(string s) // Return true if this nickname we can to use
        {
            string all_symb = mask_normal + mask_special;
 
            foreach (char ch in all_symb.ToCharArray())
            {
                Good_Symb.Add(ch);
            }
 
            foreach (char ch in s.ToCharArray())
            {
                if ( !(Good_Symb.Exists(ch)) ) // Здесь ошибка - <<<<<<<<<<<
                    return false;
            }
            return true;
        }
    }
}
using System;
using System.Text;
using System.Text.RegularExpressions;
 
namespace BadNames3
{
    public class Class1
    {
        const string mask_normal = "\\w\\dА-Яа-яҐЁЄЇіґёєї";
        const string mask_special = "'‘’!\"#$%&()*+,-./:;<=>?@[\\]^`{|}~©®№§ ";
 
        void Main()
        {
            Console.WriteLine(CheckName("SomeBadName"));
            Console.Read();
        }
 
        public bool CheckName(string s) // Return true if this nickname we can to use
        {
            StringBuilder mask = new StringBuilder();
 
            foreach (char ch in mask_special.ToCharArray())
            {
                mask.Append("\\");
                mask.Append(ch);
            }
 
            Regex regex1 = new Regex("[^" + mask_normal + mask.ToString() + "]+");
 
            MatchCollection matches = regex1.Matches(s);
 
            return (matches.Count == 0);
        }
    }
}
Есть еще вот такие проверки:
            if (Encoding.UTF8.GetByteCount(s) != s.Length)
                return "Bad symbols in the nickname!!!";
 
            if (Array.Exists<char>(s.ToCharArray(), c => c <= '\x001f') || Array.Exists<char>(s.ToCharArray(), c => c >= '\x00bf'))
Но первая глотает в том числе и символы, которые разрешены, например 'Ё' (может кодировку поставить другую вместо UTF8?) А вторая проверка - я не понимаю как работает в этой части

c => c <= '\x001f'

Почитал про предикаты и понял, что нужно почитать еще раз

Решение задачи: «Сравнение символов в строке со списком разрешенных»

textual
Листинг программы
        private static void Main ( )
        {
            Console.WriteLine( CheckName( "Correct" ) );                // True
            Console.WriteLine( CheckName( "Cor!rect" ) );               // False
            Console.WriteLine( CheckName( "Corr\u0001ect" ) );          // False
            Console.WriteLine( CheckName( "CorrёeЇct" ) );              // True
            Console.WriteLine( CheckName( "\u9999Correct\u9999" ) );    // True
            Console.WriteLine( CheckName( "\u9999Cor%rect\u9999" ) );   // False
            Console.ReadKey();
        }
 
        private static readonly char[] CorrectChars =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789абвгдежзийклмнопрстуфхцчшщьыъэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯҐЁЄЇіґёєї\u9999"
                .ToCharArray();
 
        private static bool CheckName ( string name )
        {
            return name.All( c => CorrectChars.Contains( c ) );
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.556 из 5
Похожие ответы