Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > фильтр string


Автор: n1k0LaY 18.6.2008, 10:17
Возможно ли как то быстро проверить является ли некая строка string temp, русскоязычным словом, не прибегая по символьной проверкой на принадлежание к интервалу кодов русского алфавита?
 пример такого кода(ниже)   

   private int proverka(string temp)
        {
            int k;
            for (i = 0; i < temp.Length; i++)
            {
                k=temp[i];
                if (k < 1039 || k > 1104) return -1;
            } 
            return 0;
            
        }

просто необходимо много фильтровать )) будет достаточно громоздко, да и неудобно маленько.

Автор: Walker 18.6.2008, 10:41
Ваш код вполне быстрый.
Позвольте, однако, сделать несколько замечаний:
1. Использовать лучше следующее условие:
Код

if ('А' <= k && k <= 'Я' || 'а' <= k && k <= 'я')

При всей Вашей любви к C внесите изменения, соответствующие специфике C#:
2. Тип значения, возвращаемого методом, лучше сделать bool и возвращать в зависимости от результата false или true, а назвать метод лучше как-нибудь вроде IsCyrillic().
3. вместо цикла for использовать foreach.
Код

foreach (char k in temp.ToCharArray())


Автор: mihryak 18.6.2008, 10:42
только проверкой символов
да и с ними не всё так просто
например, является ли русскоязычным слово "n-мерное (пространство)"?

Добавлено @ 10:51
Цитата(Walker @  18.6.2008,  11:41 Найти цитируемый пост)
3. вместо цикла for использовать foreach.

при действительно большом кол-ве проверок for таки предпочтительнее, не будет создаваться и использоваться класс энумератора
и ToCharArray() необязателен, sting и так реализует IEnumerable
а так - да, "оставь С всяк сюда входящий"  smile 

Автор: Bishop 18.6.2008, 11:12
Раз уж на то пошло, то идеологически правильней (и в полном соответствии с поставленной задачей) будет так:
Код
System.Text.RegularExpressions.Regex.IsMatch("АБВГДЕЁабвгдеёжзя", @"\b\p{IsCyrillic}+\b")

Автор: n1k0LaY 18.6.2008, 11:34
Не ожидал такой скорости =)) Всем спасибо кто откликнулся, буду мотать на ус)) 

Все таки сделаю... булевский тип и такую проверку)
Код

if ('А' <= k && k <= 'Я' || 'а' <= k && k <= 'я')


Автор: Bishop 18.6.2008, 11:48
n1k0LaY, в таком случае не забудьте про букву «ё» («Ё»), которая не входит в общий диапазон. 
А регулярные выражения советую изучить.

Автор: n1k0LaY 18.6.2008, 20:27
Цитата

А регулярные выражения советую изучить.

да блин меня эти слова убивают еще пока )))    недавно  C# учу , притом сразу практикой)  до этого  кодил олимп задачки и всякую всячину на pascale , так что использую стандартные методы.
А букву Ё учел) спасибо)

Автор: Idsa 18.6.2008, 21:00
Цитата(n1k0LaY @  19.6.2008,  00:27 Найти цитируемый пост)
А регулярные выражения советую изучить.

Гадость редкостная эти ваши регулярные выражения smile

Автор: Rififi 18.6.2008, 23:49
Гадость редкостная эти ваши регулярные выражения smile
"ты просто не умеешь их готовить" © (:

Автор: Idsa 18.6.2008, 23:59
Цитата(Rififi @  19.6.2008,  03:49 Найти цитируемый пост)
"ты просто не умеешь их готовить" © (: 

smile На шеф-повара не претендую, но на заслуженного поваренка - точно.

Автор: Zakonnic 19.6.2008, 12:33
Если нужна скорость, то можно сделать отдельный проект Utils с unsafe-методами. Только не забыть в свойствах проекта их разрешить. Ну и тогда переделать изначальное предложение автора (действительно, довольно быстрое), можно так:
Код

public static class Utils
{
    unsafe public static bool IsCyrillic(string str)
    {
        int len = str.Length;
        fixed (char* pString = str)
        {
            char* pChar = pString;
            for (int i = 0; i < len; i++, pChar++)
                if ((*pChar < 'А' || *pChar > 'я') && *pChar != 'ё' && *pChar != 'Ё') 
                    return false;
        }

        return true;
    }
}


Но ансейф есть ансейф... 
По идеологии дотнета логичнее все-же использовать регулярные выражения для таких задач. Но это несколько медленнее.
Ищите компромисы smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)